banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

求二維數組的全排列組合,二維數組的自乘積問題

CG 在 ETP 基地的培訓也有一段時間了,這期間也有幾次考試,下面將要分享的是最近一次筆試的考試題目,該題算是 JAVA 考試的附加題,要求也很簡單,下面是原題

二維數組的長度和初始值均由輸入確定,如何求出此數組的全排列組合,
即:int a [X][X] = {{X,X,X},...} 如下
int a[3][3] = {{1,2,3},{4,5,6},{7,8,9}}
或者是 int a [4][4] = {{1,2,3,4},{4,5,6,7},{7,8,9,10}}
計算 a [3][3] 的結果如下:
147,148,149
157,158,159
167,168,169
247,248,249
............

解決思路:
根據本題的算法複雜度可知 3*3 的二維數組可以有 3^3 = 27 中輸出結果,而利用這個結果進行不同的 % 和 / 運算,可以得到以下的周期變化的規律
// 總輸出結果數
int it = (int) Math.pow((a[0].length),(a.length)) -1;
// 產生 0-a [0].length 周期為 1 變化規律
// 以 3 為例:210210210210.....
it % a[0].length;
// 產生 0-a [0].length 周期為 a [0].length 變化規律
// 以 3 為例:222111000222111000
(it / a[0].length) % a[0].length;
// 產生 0-a [0].length 周期為 a [0].length * a [0].length 變化規律
// 以 3 為例:2222222221111111110000...
(it / a[0].length) / a[0].length % a[0].length;
以上規律則滿足我們所需要的數組下標表示

JAVA 代碼如下:

/*
* 求二維數組的全排列組合
*by CG
*/
public static void main(String[] args) {
// 測試數組
int a[][] = {{1 , 2 , 3 },{4 , 5 , 6 },{7 , 8 , 9}};
String s;
// 總循環次數,控制循環量
int it = (int) Math.pow((a[0].length),(a.length)) -1;
while(it >= 0){
s = "";
//it % a[0].length;
//(it / a[0].length) % a[0].length;
//(it / a[0].length) / a[0].length % a[0].length;
// 臨時變量,保存迭代器
int temp = it;
for(int m = 0 ; m < a.length ; m++){
if(temp / a[0].length >= 0) {
s += a[m][temp % a[0].length];
temp /= a[0].length;
}
}
System.out.println(s);
it--;
}//while
}//main

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。