gpt4 book ai didi

java - 数字中没有重复数字的计数

转载 作者:行者123 更新时间:2023-11-30 08:38:02 25 4
gpt4 key购买 nike

我正在尝试优化我的程序计数器。这取决于号码的大小(从 3 到 10 位数字,没有重复)- 例如012、013,214等我的第一个解决方案是 for 循环,像这样:

private void sample() {
int[] varValue = new int[3];
innerloop: for (int a = 0; a < 10; a++) {
for (int b = 0; b < 10; b++) {
if (a == b)
continue;
for (int c = 0; c < 10; c++) {
if (c == b)
continue;
if (c == a)
continue;
varValue[0] = a;
varValue[1] = b;
varValue[2] = c;

int EqOne = varValue[0] * 100 + varValue[1] * 10 + varValue[2];

if (EqOne == 432) {
System.out.println(varValue[0]);
System.out.println(varValue[1]);
System.out.println(varValue[2]);
break innerloop;
}

}
}

}
}

或 10 位数字 ( https://gist.github.com/TrollerN/6a0e470c539c57fd4cd73086cf6eb41b )

然后我可以将这些 a、b、c 添加到 int[] 或 ArrayList 并使用它。没关系,但是有 10 个不同的数字,它需要 10 个 for 循环if 语句 + 我必须创建 8 种不同的方法 - 每个数字一个。

我还尝试创建 10 位数字(0、1、2、3、4、5、6、7、8、9)的 ArrayList,对其进行洗牌,然后返回 3-10 位数字,但它永远不会- 9-10 位数字的结束循环。

我的下一个“伟大”想法(不,老实说,这是迄今为止最愚蠢的想法 :D)是针对每种情况将组合的 ArrayList 保存到文件中,然后加载所需的组合并通过它找到解决方案。

我正在考虑创建一些方法来获取位数(“因此它知道它需要多少个循环”)和/或最后一个解决方案以便它知道要开始。

编辑:我用示例方法修改了问题。当然 int EqOne 和 If 语句要复杂得多,但它在技术上显示了我想要实现的目标 - 至少我希望 :P

我一直在寻找一种方法,它会根据需要创建尽可能多的循环和大数组/数组列表?

最佳答案

假设您想要给定长度的数字,而不是字符串,一种方法是使用boolean[10] 记住当前使用的数字,因此可以快速跳过它们。

然后将数字保存在一个数组中,并像处理普通数字一样递增最后一位数字。当它翻转时,您增加倒数第二个数字,依此类推,将尾随数字重置为未使用的数字。

示例:如果当前号码是 1097,则如下所示:

Digits  In Use               Description
1097 0 1 _ _ _ _ _ 7 _ 9
1097 0 1 _ _ _ _ _ _ _ 9 Clear in-use of last digit
1098 0 1 _ _ _ _ _ _ _ 9 Increment last digit
1098 0 1 _ _ _ _ _ _ 8 9 Mark in-use
=======================================================
1098 0 1 _ _ _ _ _ _ _ 9 Clear in-use of last digit
1099 0 1 _ _ _ _ _ _ _ 9 Increment last digit, but it's in use
109? 0 1 _ _ _ _ _ _ _ 9 Rollover, so go to previous digit
109? 0 1 _ _ _ _ _ _ _ _ Clear in-use
10?? 0 1 _ _ _ _ _ _ _ _ Rollover, so go to previous digit
10?? _ 1 _ _ _ _ _ _ _ _ Clear in-use
11?? _ 1 _ _ _ _ _ _ _ _ Increment digit, but it's in use
12?? _ 1 _ _ _ _ _ _ _ _ Increment digit
12?? _ 1 2 _ _ _ _ _ _ _ Mark in-use
120? 0 1 2 _ _ _ _ _ _ _ Set to first unused digit, and mark in-use
1203 0 1 2 3 _ _ _ _ _ _ Set to first unused digit, and mark in-use
=======================================================

如您所见,逻辑使它从 10971098 再到 1203

这是逻辑。参见 IDEONE运行示例。

final class UniqueDigitCounter {
private int[] digits;
private boolean[] inUse = new boolean[10];
public UniqueDigitCounter(int digitCount) {
if (digitCount < 1 || digitCount > 10)
throw new IllegalArgumentException("Invalid digit count: " + digitCount);
this.digits = new int[digitCount];
for (int i = 0; i < digitCount; i++) {
this.digits[i] = i;
this.inUse[i] = true;
}
}
public long next() {
if (this.digits == null)
return -1; // end of sequence
long value = 0;
for (int i = 0; i < this.digits.length; i++)
value = value * 10 + this.digits[i];
for (int i = this.digits.length - 1; ; i--) {
if (i == -1) {
this.digits = null; // end of sequence
break;
}
int digit = this.digits[i];
this.inUse[digit] = false;
if ((digit = nextDigit(digit + 1)) != -1) {
this.digits[i] = digit;
while (++i < this.digits.length)
this.digits[i] = nextDigit(0);
break;
}
}
return value;
}
private int nextDigit(int minDigit) {
for (int digit = minDigit; digit < 10; digit++)
if (! this.inUse[digit]) {
this.inUse[digit] = true;
return digit;
}
return -1;
}
}

关于java - 数字中没有重复数字的计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36775057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com