在第一份工作结束的时候,还是个java小白,找工作的时候去面试,碰到一个算法题:
从十个数字中选取八个数字排列,重复算一个,一共有多少种可能?
当时想了半天也没想出来,虽然是数学上的排列组合算法,但是还是想自己思考下解决方案。
今天发一下自己的解决思路,思路很简单,适合初级程序员:
1、假定max个数,抽取min个数字
2、初始化一个组合为数字 0-min
3、固定min-1个数字,找出其中一个数字的可替换可能,从高min到低0依次替换第cou位数字
4、替换前设定第cou位之后到min位的数字全为-1
5、替换第cou位,若发现所有组合数字全部替换完毕,则是一种组合,否则,替换第cou+1位(迭代)
有几个替换原则了解一下:
1、替换cou位数字的值一定要大于cou位数字,例如:0-2-?,?一定要大于2,可以保证所有的组合都是从小到大排列,既不会重复
2、替换cou位数字完毕之后,一定要依次替换cou位之后为-1的,直到替换到最后一位,例如:1-?-? 第一次替换位1-2-?, 要接着替换第三位为1-2-3,1-2-4
接下来,用代码来了解一下:
package com.lytx.ims.aa;
import java.util.ArrayList;
import java.util.List;
/**
* max十个