多个数组全组合的问题

昨天遇到了这样的一个问题:输入n(运行时可知)个数组(集合)A[a1,a2...an],数组(集合)长度为M[m1, m2...mn],要求输出这n个数组(集合)中每个元素的组合,输出的每个数组长度为n,数组的个数为m1*m2*...*mn。

第一次尝试:

思路:使用一个辅助pair数组,将输入的A的每个元素长度记录到first,second用于后续计数。然后使用循环遍历A中每个元素的每个组合。下面是伪代码:

arrays=[[],[],[],...]
counts=[[size a1,0],[size a2,0],[size a3,0],...]
complete = false
while !complete:
    complete = True
    for index=0; index < arrays.len; index+=1:
        pos = counts[index][1]
        countSize = counts[index][0]
        if complete:
            counts[index][1]+=1
            complete=False
            pos += 1
        if pos >= (countSize):
            complete=True
            counts[index][1]=0
            pos=0
        print '%d\t', arrays[index][pos]
    print '\n'
表现还可以,就是有一点不理想,常理上的第一个组合排到了最后一个位置。

                                       

第二次尝试:

思路:上面的代码把第一个组合放到后面的根本原因是在开始遍历时,我先置complete为true了,所以第一次pos就会加1。理由是我想给循环一个刺激点开始增长。折腾了很久,发现要把打印放到前面,顺序就对了。尴尬

... 
for index=0; index < arrays.len; index+=1:
        pos = counts[index][1]
        countSize = counts[index][0]
 	print '%d\t', arrays[index][pos]
...

WCS同学看不下去了,觉得前面的好难读,给了我如下代码。

public class FreeMain {
    public static void main(String[] args){
        Object[][] values=new Object[][]{{"a","b","c","d","e","f"},{"11","22","33","44","66"},{"&","$","!","*"}};
        int[] symbol=new int[values.length];
        Arrays.fill(symbol,0);
        
        while(symbol[0] <values[0].length){
            StringBuilder str=new StringBuilder();
            for(int i=0;i<symbol.length;i++){
                str.append(values[i][symbol[i]]).append(" ");
            }
            System.out.println(str);
            
            symbol[symbol.length-1]++;
                        
            for(int j=symbol.length-1;j>=0;j--){
                if(symbol[j]>=values[j].length && j>0){
                    symbol[j]=0;
                    symbol[j-1]++;
                }
            }
        }
        
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值