我想生成所有可能的字符串,从长度1到长度5,由字符a-z和0-9组成。
我发现了可能对我有帮助的代码片段,但我仍然坚持修改它们以实现我的需要。
我在SO上找到的这段代码将使用a-z和0-9,1679216字符串产生长度为4的所有可能的字符串组合。
public static void generate(){
int MAX = 36;
long count = 1L * MAX * MAX * MAX * MAX;
int counter = 0;
char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
int[] digits = new int[4];
char[] output = "0000".toCharArray();
for (int i= 0; i < count; i++){
String name = String.valueOf(output);
for(int d = 3; d >=0; --d){
digits[d] = (digits[d] + 1) % MAX;
output[d] = alphabet[digits[d]];
if (digits[d] > 0){
break;
}
}
counter++;
System.out.println(name);
}
System.out.println(counter);
}
现在这不是我所需要的,但它很接近,也许我可以让它发挥作用!我已尝试通过以下方式修改它,但是存在索引问题,无处不在抛出ArrayOutBounds异常。思考过程是,我可以将整个块包装在另一个for循环中,处理数字和输出的大小,从1到5。我修改的时间越多,它得到的丑陋越多,我就越多思考,“必须有一个更清洁的方式”。
public static void generate(){
int MAX = 36;
long count = 1L * MAX * MAX * MAX * MAX * MAX;
String build = null;
int counter = 0;
char[] alphabet = "0123456789abcdefghijklmnopqrstuvwxyz".toCharArray();
int[] digits = null;
char[] output = null;
for (int j = 1; j < 5; j++){
build = null; //clear build
digits = null; //clear digits
outputs = null; //clear outputs
digits = new int[j]; //initialize digits to size j
//small loop to append "0" to build
for (int m = 0; m < j; m++){
build = build + "0";
}
output = build.toCharArray(); //convert our string to charArray
for (int i= 0; i < count; i++){
String name = String.valueOf(output);
for(int d = 3; d >=0; --d){
digits[d] = (digits[d] + 1) % MAX;
output[d] = alphabet[digits[d]];
if (digits[d] > 0){
break;
}
}
counter++;
System.out.println(name);
}
}
System.out.println(counter);
}
答案 0 :(得分:2)
您需要修改行
long count = 1L * MAX * MAX * MAX * MAX * MAX; // one more * MAX
...
int[] digits = new int[5]; // from [4]
char[] output = "00000".toCharArray(); // from 0000
...
for(int d = 4; d >=0; --d){ // from d = 3
更一般地说,如果n
是位数,
long count = 1L;
for( int i=0; i<n; i++ ) count *= MAX;
...
int[] digits = new int[n];
char[] output = new char[n];
Arrays.fill( output, '0' );
...
for(int d = n-1; d >=0; --d){
答案 1 :(得分:1)
您可以修改generate
以将前导字符作为参数,并打印以该字符开头的所有5个字符的字符串。然后使用每个可能的前导字符调用此修改后的generate
。