从一串数字中找出所有可能的数字组合,同时保持原来的顺序
Find all possible combination of numbers from a string of number while maintaining the original order
假设你有字符串:1234
我需要的是从这个字符串中生成所有可能的数字组合,但是必须保持字符串的原始顺序。
此外,每个结果中必须至少有 2 个数字。
在 1234 的情况下,输出将是列表的列表
输出列表:
list: 1, 2, 3, 4
list: 12, 3, 4
list: 123, 4 --Note a list containing only 1234 is not valid
list: 1, 23, 4
list: 1, 234
list: 1, 2, 34
list: 12, 34
另请注意,每个结果列表中的数字始终以与原始字符串 1234 相同的方式排序。因此具有组合 34、21 或 213、4 的列表无效。
我能想到的唯一方法:
- 从第一个索引 (1) 开始
- 追加下一个数字以形成一个新数字(12)
- 然后递归传入新形成的数追加下一个数(123)
- 第一个索引完成后,我们从第二个索引(2)重新开始
- ...
但是我不知道如何生成 12、34 组合
非常感谢任何帮助!
1 | 2 | 3 | 4 | 5
| | | |
d1 d2 d3 d4
假设原始字符串的长度为 5,我们通过添加可以为空的分隔符 d1、d2、d3 和 d4 来划分该字符串。
- 当 d1、d2、d3、d4 全部 为空时,我们得到
12345
.
- 当d2、d3、d4为空时,我们得到
1, 2345
- 当d1,d2,d3,d4的none为空时,得到
1,2,3,4,5
对于我们添加的每个分隔线,它都有两个选项:可见或消失,
所以当 n 是原始字符串的长度时,可能的总数是 2^(n-1) - 1
那么,接下来我们要解决的问题就是迭代所有的可能性:
使用二进制值表示除法器:
for (int i = 1; i <= pow(2, n - 1); i++) {
// i = 1, 0b0001, d4 is visible, we get 1234,5
// i = 2, 0b0010, d3 is visible, we get 123,45
// i = 3, 0b0011, d3 and d4 is visible, we get 123,4,5
// i = 4, 0b0100, d2 is visible, we get 12,345
// i = 5, 0b0101, d2 and d4 is visible, we get 12, 34, 5
// i = 6, 0b0110, d2 and d3 is visible, we get 12, 3, 45
// i = 7, 0b0111, d2,d3,d4 is visible, we get 12,3,4,5
// go on...
}
希望有所帮助...
您可以使用类似的方法来获得您需要的输出。
修改为简单遍历
String str="1234";
StringBuilder sb=new StringBuilder(str);
int l=str.length();
for(int i=0;i<l;i++){
int j=i+1;
if(i!=0)
j=i+2;
for(;j<l+1;j++){
sb.insert(j, ',');
System.out.println(sb);
sb.deleteCharAt(j);
}
sb=new StringBuilder(str);
sb.insert(i+1, ',');
}
它产生以下输出
1,234
12,34
123,4
1234,
1,2,34
1,23,4
12,3,4
假设你有字符串:1234
我需要的是从这个字符串中生成所有可能的数字组合,但是必须保持字符串的原始顺序。
此外,每个结果中必须至少有 2 个数字。
在 1234 的情况下,输出将是列表的列表
输出列表:
list: 1, 2, 3, 4
list: 12, 3, 4
list: 123, 4 --Note a list containing only 1234 is not valid
list: 1, 23, 4
list: 1, 234
list: 1, 2, 34
list: 12, 34
另请注意,每个结果列表中的数字始终以与原始字符串 1234 相同的方式排序。因此具有组合 34、21 或 213、4 的列表无效。
我能想到的唯一方法:
- 从第一个索引 (1) 开始
- 追加下一个数字以形成一个新数字(12)
- 然后递归传入新形成的数追加下一个数(123)
- 第一个索引完成后,我们从第二个索引(2)重新开始
- ...
但是我不知道如何生成 12、34 组合
非常感谢任何帮助!
1 | 2 | 3 | 4 | 5
| | | |
d1 d2 d3 d4
假设原始字符串的长度为 5,我们通过添加可以为空的分隔符 d1、d2、d3 和 d4 来划分该字符串。
- 当 d1、d2、d3、d4 全部 为空时,我们得到
12345
. - 当d2、d3、d4为空时,我们得到
1, 2345
- 当d1,d2,d3,d4的none为空时,得到
1,2,3,4,5
对于我们添加的每个分隔线,它都有两个选项:可见或消失,
所以当 n 是原始字符串的长度时,可能的总数是 2^(n-1) - 1
那么,接下来我们要解决的问题就是迭代所有的可能性: 使用二进制值表示除法器:
for (int i = 1; i <= pow(2, n - 1); i++) {
// i = 1, 0b0001, d4 is visible, we get 1234,5
// i = 2, 0b0010, d3 is visible, we get 123,45
// i = 3, 0b0011, d3 and d4 is visible, we get 123,4,5
// i = 4, 0b0100, d2 is visible, we get 12,345
// i = 5, 0b0101, d2 and d4 is visible, we get 12, 34, 5
// i = 6, 0b0110, d2 and d3 is visible, we get 12, 3, 45
// i = 7, 0b0111, d2,d3,d4 is visible, we get 12,3,4,5
// go on...
}
希望有所帮助...
您可以使用类似的方法来获得您需要的输出。 修改为简单遍历
String str="1234";
StringBuilder sb=new StringBuilder(str);
int l=str.length();
for(int i=0;i<l;i++){
int j=i+1;
if(i!=0)
j=i+2;
for(;j<l+1;j++){
sb.insert(j, ',');
System.out.println(sb);
sb.deleteCharAt(j);
}
sb=new StringBuilder(str);
sb.insert(i+1, ',');
}
它产生以下输出
1,234
12,34
123,4
1234,
1,2,34
1,23,4
12,3,4