java排列组合二维数组_[算法]求二维数组的全排列组合,二位数组的自乘积问题 | 李大仁博客...

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

/*

*求二维数组的全排列组合

*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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值