JAVA的算法實現--從長度為n的數組(元素互不相同)中任意選擇m個數的所有組合


從長度為n的數組(元素互不相同)中任意選擇m個數的所有組合

 

//分析及構思

1.鍵盤輸入數組的長度

2.鍵盤輸入組合的個數

3.利用隨機數獲得一個數組

4.在構建數組是要對數組中的元素進行判斷,保證新生成的隨機數與之前的數不同

5.以數組a[]和m為參數調用方法zuhe(a,m)得到一個list  

6.遍歷輸出list

算法:
1.創建一個輔助數組tempNum和a相對應.tempNum中的值是0或1,1所在的位置就是我們要在a中取值的位置.
2.對數組tempNum進行賦初始值,從0位置開始,到m-1位置賦值為1,其它賦值為0
3.調用print函數,輸出當前tempNum數組的狀態(作為參考)
4.調用createResult方法,方法返回一個int型的數組,作為list.add()的參數給list容器賦第一個值 list.add(zuhe.createResult(a, tempNum, m));
5.循環開始:從左往右遍歷tempNum,找到第一個10,將其變成01,並且記錄位置pose,算出該位置左邊有多少個1,將這些1全部移到最左邊,判斷n-m位置到n-1位置是否
全部為1,設置flag,默認值為false,如果n-m到n-1位置有0,則將flag置TRUE,繼續進行do-while 循環,否則循環結束,得到一個list容器,里面裝的值就是我們需要的各種
組合情況.
6調用print1函數,將list打印出來.

11100
11010 pose=2 sum=2 flag=false
10110 pose=1 sum=1 flag=false
01110 pose=0 sum=0 flag=false
01101 pose=3 sum=2 flag=false
->11001
10101 pose=1 sum=1 flag=false
01101 pose=0 sum=0 flag=false
01011 pose=2 sum=1 flag=false
->10011
01011 pose=0 sum=0 flag=false
00111 pose=1 sum=0 flag=true
return list;

 

 

 

//編碼

 

package xxx;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.Scanner;

public class Zuhe1 {

private List zuhe(int[] a, int m) {
Zuhe1 zuhe = new Zuhe1();
List list = new ArrayList();
int n = a.length;
boolean flag = false; // 是否是最后一種組合的標記

// 生成輔助數組。首先初始化,將數組前n個元素置1,表示第一個組合為前n個數。
int[] tempNum = new int[n];

for (int i = 0; i < n; i++) {
if (i < m) {
tempNum[i] = 1;
} else {
tempNum[i] = 0;
}

}
print(tempNum);// 打印輔助數組
list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默認組合
do {
int pose = 0; // 記錄改變的位置
int sum = 0; // 記錄改變位置 左側 1 的個數

// 然后從左到右掃描數組元素值的“10”組合,找到第一個“10”組合后將其變為“01”
for (int i = 0; i < (n - 1); i++) {
if (tempNum[i] == 1 && tempNum[i + 1] == 0) {
tempNum[i] = 0;
tempNum[i + 1] = 1;
pose = i;
break;
}
}


print(tempNum);// 打印輔助數組
list.add(zuhe.createResult(a, tempNum, m));// 打印第一中默認組合
// 同時將其左邊的所有“1”全部移動到數組的最左端。
for (int i = 0; i < pose; i++) {
if (tempNum[i] == 1)
sum++;
}
for (int i = 0; i < pose; i++) {
if (i < sum)
tempNum[i] = 1;
else
tempNum[i] = 0;
}
// 判斷是否為最后一個組合:當第一個“1”移動到數組的m-n的位置,即n個“1”全部移動到最右端時,就得到了最后一個組合。
flag = false;
for (int i = n - m; i < n; i++) {
if (tempNum[i] == 0)
flag = true;
}
} while (flag);
return list;
}


// 根據輔助數組和原始數組生成 結果數組
public int[] createResult(int[] a, int[] temp, int m) {
int[] result = new int[m];
int j = 0;
for (int i = 0; i < a.length; i++) {
if (temp[i] == 1) {
result[j] = a[i];
System.out.println("result[" + j + "]:" + result[j]);
j++;
}
}
return result;
}

// 打印
public void print1(List list) {
for (int i = 0; i < list.size(); i++) {
System.out.println();
int[] temp = (int[]) list.get(i);
for (int j = 0; j < temp.length; j++) {
System.out.print(temp[j] + " ");
}
}
}

// 打印整數數組的方法
public void print(int[] a) {
System.out.println("生成的輔助數組為:");
for (int i = 0; i < a.length; i++) {
System.out.print(a[i]);
}
System.out.println();
}


public static void main(String[] args) {

Random random = new Random();
Scanner scan =new Scanner(System.in);
System.out.println("請輸入數組元素的個數:");
int m=scan.nextInt();
int[] a= new int[m];
int b=0;

int i=0;
for(;i<m;i++){

b=random.nextInt(101);
a[i]=b;

for(int j=0;j<i;j++){
if(a[j]==b){
--i;
break;
}
}

}



System.out.print("這是隨機生成的數組:");
for(int k=0;k<a.length;k++){
System.out.print(a[k]+" ");


}

System.out.println();


System.out.println("請輸入組合元素的個數:");
int n=scan.nextInt();




Zuhe1 zuhe = new Zuhe1();
List list = zuhe.zuhe(a, n);
zuhe.print1(list);
}





}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM