组合问题:输出从m个数中的任意抽取n个数的组合全部可能序列
2009-10-29 23:16
447 查看
面试的人员最后给了我一个题目,我当时傻眼了。他当时问我数学怎么样,我说,“我数学还可以!”。然后他说,要给我一个数学编程的题目做。我说:“会不会很难啊!”。他微笑的说:"很简单!"
题目是这样出的:5个香蕉,4个梨子,3个苹果。如何用程序实现,将这个些水果排列成不同的组合,并用某种语言来实现!
我找的一些资料:
数学中的组合运算在统计中是十分常见的运算,但用程序输出所有组合的可能性却并不容易。这里介绍一个非常酷的组合算法:(太TM牛逼了)
组合问题:输出从m个数中的任意抽取n个数的组合全部可能序列。
[10反转置换法]
算法思想:
(1) 初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。
(2) 从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。
(3) 重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能序列了。 为什么?你想,(以m=5,n=3为例)一开始是11100,最后就是00111,已经没有10组合了 。
//10置换法源代码
public void combination(int m,int n)
{
char[] totalArray=new char[m];
//记录排序次数
int totalSortNum=0;
//建立 111...100...0
for(int i=0;i<m;i++){
if(i<n)
totalArray[i]='1';
else
totalArray[i]='0';
}
totalSortNum+=1;
System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));
//"10"反转置换法
int index=-1;
while((index=String.valueOf(totalArray).indexOf("10"))!=-1){
//交换"10"为"01"
totalArray[index]='0';
totalArray[index+1]='1';
//计算刚反转的"10"前面所有的'1'全部移动到最左边
int count=0;
for(int i=0;i<index;i++){
if(totalArray[i]=='1')
count++;
}
for(int j=0;j<index;j++){
if(j<count)
totalArray[j]='1';
else totalArray[j]='0';
}
//输出结果
totalSortNum++;
System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));
}
}
题目是这样出的:5个香蕉,4个梨子,3个苹果。如何用程序实现,将这个些水果排列成不同的组合,并用某种语言来实现!
我找的一些资料:
数学中的组合运算在统计中是十分常见的运算,但用程序输出所有组合的可能性却并不容易。这里介绍一个非常酷的组合算法:(太TM牛逼了)
组合问题:输出从m个数中的任意抽取n个数的组合全部可能序列。
[10反转置换法]
算法思想:
(1) 初始化一个m个元素的数组(全部由0,1组成),将前n个初始化为1,后面的为0。这时候就可以输出第一个组合序列了。
(2) 从前往后找,找到第一个10组合,将其反转成01,然后将这个10组合前面的所有1,全部往左边推 ,即保证其前面的1都在最左边。这时又可以输出一组组合序列了。
(3) 重复第(2)步,知道找不到10组合位置。这时已经输出了全部的可能序列了。 为什么?你想,(以m=5,n=3为例)一开始是11100,最后就是00111,已经没有10组合了 。
//10置换法源代码
public void combination(int m,int n)
{
char[] totalArray=new char[m];
//记录排序次数
int totalSortNum=0;
//建立 111...100...0
for(int i=0;i<m;i++){
if(i<n)
totalArray[i]='1';
else
totalArray[i]='0';
}
totalSortNum+=1;
System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));
//"10"反转置换法
int index=-1;
while((index=String.valueOf(totalArray).indexOf("10"))!=-1){
//交换"10"为"01"
totalArray[index]='0';
totalArray[index+1]='1';
//计算刚反转的"10"前面所有的'1'全部移动到最左边
int count=0;
for(int i=0;i<index;i++){
if(totalArray[i]=='1')
count++;
}
for(int j=0;j<index;j++){
if(j<count)
totalArray[j]='1';
else totalArray[j]='0';
}
//输出结果
totalSortNum++;
System.out.println(totalSortNum+"/t"+Arrays.toString(totalArray));
}
}
相关文章推荐
- 针对如"123456"之类的任意字符序列,输出它们所有的排列组合
- 给定n个数{1,2,3,...,n},从中选择任意两两不同的k个数,输出所有可能的组合
- 回溯法输出字符串入栈出栈的全部可能序列
- 输出任意多个序列的排列组合
- 字母a-z,数字0-9,现需要其中任意3个作为密码,请输出所有可能组合。
- 2012.9腾讯笔试题: 顺序输出到栈, 栈中元素可任意时刻出栈. 求输出序列的可能数
- 输入两个整数n 和m,从数列1,2,3.......n 中任意取几个数, 使其和等于m ,要求将当中全部的可能组合列出来
- 任意数字序列“123456”之类,输出它们所有的排列组合
- 1-n,从中选择任意两两不同的k个数,输出所有可能的组合,要求不重不漏
- 2012.9腾讯笔试题: 顺序输出到栈, 栈中元素可任意时刻出栈. 求输出序列的可能数
- 任意数字、字符序列,输出它们所有的排列组合
- poj 3683 2-sat问题,输出任意一组可行解
- 【专题】计数问题(排列组合,容斥原理,Prufer序列)
- 输入M,N值,从1至N开始顺序循环数数,每数到M输出该数值,直至全部输出(约瑟夫环问题)
- 1,2,5,10四个基数任意次数组合相加得到一个数N,求所有可能组合
- 算法 输出字符串字符的任意组合
- 读取Html文本字符串时可能遇到输出时打印字体格式或者换行符之类问题的情况
- 栈问题-根据入栈序列,得出可能的出栈序列
- 输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。 比如输入的push序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个pop系列。
- 彩球分配问题:共有12个彩球,4个红的,4个白的,4个黄的,从中挑出8个球放入3个不同的口袋(口袋编号分别为a、b、c)编写程序打印输出所有可能的放法。