我很抱歉标题有点混乱,我不确定如何表达它。
我需要创建一个 char 数组,以允许字符集的所有可能排列。
如果我给你:
char[] charSet = {"a", "b", "c"};
BigInteger value = n; //where n is a number >= 0
char[] charArray = createCharArray(value, charSet);
如何从 value 和 charSet 创建 charArray ,这样如果我运行:
createCharArray(new BigInteger("6"), {"a", "b", "c"});
它会返回 {"a", "c"} 因为
- a=1
- b=2
- c=3
- aa=4
- ab=5
- ac=6
这是我到目前为止所拥有的:
private char[] createCharArray(BigInteger value, char[] charSet){
List<Character> charArray = new ArrayList<Character>();
if (value.compareTo(this.max) == 0)
System.out.println("");
BigInteger csSize = new BigInteger(String.valueOf(charSet.length));
if(this.powers.isEmpty())
this.powers.add(0, csSize.pow(0));
if(this.sumPowers.isEmpty())
this.sumPowers.add(0, csSize.pow(0));
BigInteger curPow;
int i = 1;
while((curPow = csSize.pow(i)).compareTo(value) <= -1){
if(this.powers.size() <= i)
this.powers.add(i, curPow);
if(this.sumPowers.size() <= i)
this.sumPowers.add(i, this.sumPowers.get(i-1).add(curPow));
i += 1;
}
i -= 1;
while (i >= 0 && value.compareTo(BigInteger.ZERO) >= 0){
if (i <= 1){
int charNum = value.divide(this.sumPowers.get(0)).intValue() - 1;
charArray.add(charSet[charNum]);
}
else{
int charNum = value.divide(this.sumPowers.get(i-1).subtract(BigInteger.ONE)).intValue() - 1;
charArray.add(charSet[charNum]);
}
value = value.subtract(this.powers.get(i));
i -= 1;
}
char[] returnArray = new char[charArray.size()];
int j = 0;
while(j<charArray.size()){
returnArray[j] = charArray.get(j);
j += 1;
}
return returnArray;
}
它当然可以使用一些帮助,因为值 0 失败,值 1 和 2 成功,3-8 失败,9、10 成功,等等。
编辑:要清楚,值参数必须能够是任何数字 n > 0。这就是我选择 BigInteger 的原因