I/p:5278
所需的 o/p:527,278,785,852(我手动执行此操作)。但如果数量很大,那么它就是一个问题。
注意:输出应该是没有重复组合的方式。(即在上述组合中,有一个数字 527 就足够了,我不希望输出中可能有 257 或 725 等组合,
我怎样才能做到这一点?有什么线索吗?
编辑:一个重要的事情是输入数字是唯一的。为了在任何时候更清楚输入不能有像 1123 0r 3455 这样的值。
I/p:5278
所需的 o/p:527,278,785,852(我手动执行此操作)。但如果数量很大,那么它就是一个问题。
注意:输出应该是没有重复组合的方式。(即在上述组合中,有一个数字 527 就足够了,我不希望输出中可能有 257 或 725 等组合,
我怎样才能做到这一点?有什么线索吗?
编辑:一个重要的事情是输入数字是唯一的。为了在任何时候更清楚输入不能有像 1123 0r 3455 这样的值。
这里有一些例子:
public class Combination {
public static void main(String[] args) {
StringBuilder builder = new StringBuilder("5278");
String str;
int lastIndex;
if(builder.length() % 2 == 0) {
lastIndex = builder.length() / 2;
} else {
lastIndex = builder.length() / 2 + 1;
}
str = builder.toString() + builder.toString().substring(0, lastIndex);
for (int i = 0; i < builder.length(); i++) {
System.out.println(str.substring(i, i + 3));
}
}
}
更新比上面更简单的方式(基于与veredesmarald的对话)
public class Combination {
public static void main(String[] args) {
char[] digits = Integer.toString(123).toCharArray();
for (int i = 0; i < digits.length; i++) {
System.out.println("" + digits[i] + digits[(i + 1) % digits.length] + digits[(i + 2) % digits.length]);
}
}
}
public static void printCombinations(int input)
{
char[] digits = Integer.toString(input).toCharArray();
for (int i = 0; i < digits.length - 2; i++) {
for (int j = i + 1; j < digits.length - 1; j++) {
for (int k = j + 1; k < digits.length; k++) {
System.out.println("" + digits[i] + digits[j] + digits[k]);
}
}
}
}
这将从您的输入整数中获得 3 位数字的所有唯一组合。请注意,这仅在您所说的数字唯一时才有效。如果您需要构建其他长度的组合,您可以编写一个递归函数。
样本输出:
printCombinations(12345);
123
124
125
134
135
145
234
235
245
345
Integer input = 5278;
List<Character> digits = new ArrayList<Character>();
for(char c : String.valueOf(input).toCharArray()) {
digits.add(Character.valueOf(c));
}
int a = 0;
for(int i=0; i<digits.size(); i++){
for(int j=0; j<digits.size(); j++){
for(int k=0; k<digits.size(); k++){
if(!digits.get(i).equals(digits.get(j)) && !digits.get(j).equals(digits.get(k)) && !digits.get(i).equals(digits.get(k))){
System.out.println(++a +": " + digits.get(i) + digits.get(j) + digits.get(k));
}
}
}
}
private static void test() {
int a[] = { 1, 2, 3, 4, 5, 6 };
char[] digits = Integer.toString(123456).toCharArray();
Set<String> res = new HashSet<>();
int i = 0;
int m = digits.length - 1;
while (i <= digits.length - 1 && m >= 0) {
for (int j = 0; j <= digits.length - 1; j++) {
for (int k = 0; k <= digits.length - 1; k++) {
if (digits[j] != digits[k] && digits[i] != digits[j] && digits[m] != digits[j]) {
res.add(digits[i] + "" + digits[j] + "" + digits[k]);
res.add(digits[i] + "" + digits[k] + "" + digits[j]);
res.add(digits[m] + "" + digits[k] + "" + digits[j]);
res.add(digits[m] + "" + digits[j] + "" + digits[k]);
}
}
}
i++;
m--;
}
res.stream().forEach(e -> System.out.println(e));
}
将输入的数字放入列表中,创建将返回此列表索引的随机生成器,形成您的输出:
Integer input = 5278;
char[] digits = String.valueOf(input).toCharArray();
int numberOfTrinities = 4;
String result = "";
Random generator = new Random();
List<String> trinities = new ArrayList<String>();
while(trinities.size() < numberOfTrinities ) {
String nextTrinity = "";
for(int i = 0; i < 3; i++) {
nextTrinity += digits(generator.nextInt(digits.size()));
}
if(isUniqueDigitsTrinity(trinities, nextTrinity)) {
trinities.add(nextTrinity);
}
}
String result = "";
for(String trinity : trinities) {
result += trinity;
}
System.out.printl("Input: " + input + ", Result: " + result);
我们需要这个来检查三位一体的唯一数字:
private boolean isUniqueDigitsTrinity(List<String> trinities, String candidateTrinity) {
for(String existingTrinity : trinities) {
String checker = existingTrinity;
for(char candidateChar : candidateTrinity.toCharArray()) {
checker.replace(candidateChar, '');
}
if(checker.length() <= 0) {
return false;
}
}
return true;
}