查找两个数字是否共享一个数字
Finding Whether Two Numbers Share a Digit
我正在研究这个问题,我应该使用循环来查找两个数字是否共享一个数字。如果共享数字是数字的第一位,我编写的代码不会 return 为真。我在我的代码或任何其他解决方案中找不到错误。请帮忙!
public static boolean hasSharedDigit(int firstNumber, int secondNumber) {
if ((firstNumber < 10 || firstNumber > 99) || (secondNumber < 10 || secondNumber > 99)) {
return false;
}
int testFirstNumber = firstNumber;
int testSecondNumber = secondNumber;
while (testFirstNumber != 0) {
while (testSecondNumber != 0) {
if ((testFirstNumber % 10) == (testSecondNumber % 10)) {
return true;
}
testSecondNumber /= 10;
}
testFirstNumber /= 10;
}
return false;
}
您应该在下一个 testFirstNumbber 循环之前重置 testSecondNumber。
在您的代码中,内部循环仅被调用一次,因为 testSecondNumber 变为 0 且未被重置。
正确的解决方案是:
public static boolean hasSharedDigit(int firstNumber, int secondNumber) {
if ((firstNumber < 10 || firstNumber > 99) || (secondNumber < 10 || secondNumber > 99)) {
return false;
}
int testFirstNumber = firstNumber;
while (testFirstNumber != 0) {
int testSecondNumber = secondNumber;
while (testSecondNumber != 0) {
if ((testFirstNumber % 10) == (testSecondNumber % 10)) {
return true;
}
testSecondNumber /= 10;
}
testFirstNumber /= 10;
}
return false;
}
似乎提供的解决方案只检查 2 位数字,因此在这种情况下性能不是问题,使用嵌套循环应该不会有任何严重影响。
但是,如果需要为任何整数(不仅是正数)找到一个公共数字,最好使用一个小数组来计算第一个数字中的数字,然后验证是否是第二个数字此数组中存在数字,没有使用嵌套循环。
static boolean commonDigits(int xx, int yy) {
// handle negative values
int x = Math.abs(xx);
int y = Math.abs(yy);
int[] digits = new int[10];
if (x == 0) { // handle 0
digits[0]++;
}
while (x > 0) {
digits[x % 10]++;
x /= 10;
}
// check for 0
if (y == 0 && digits[0] > 0) {
return true;
}
while (y > 0) {
if (digits[y % 10] > 0) {
return true;
}
y /= 10;
}
return false;
}
基于通过转换为字符串将数字转换为字符流的较短版本可能如下所示:
static boolean commonDigitsStream(int x, int y) {
int[] digits = new int[10];
Integer.toString(Math.abs(x))
.chars()
.map(i -> i - '0')
.forEach(i -> digits[i]++);
return Integer.toString(Math.abs(y))
.chars()
.map(i -> i - '0')
.anyMatch(i -> digits[i] > 0);
}
我正在研究这个问题,我应该使用循环来查找两个数字是否共享一个数字。如果共享数字是数字的第一位,我编写的代码不会 return 为真。我在我的代码或任何其他解决方案中找不到错误。请帮忙!
public static boolean hasSharedDigit(int firstNumber, int secondNumber) {
if ((firstNumber < 10 || firstNumber > 99) || (secondNumber < 10 || secondNumber > 99)) {
return false;
}
int testFirstNumber = firstNumber;
int testSecondNumber = secondNumber;
while (testFirstNumber != 0) {
while (testSecondNumber != 0) {
if ((testFirstNumber % 10) == (testSecondNumber % 10)) {
return true;
}
testSecondNumber /= 10;
}
testFirstNumber /= 10;
}
return false;
}
您应该在下一个 testFirstNumbber 循环之前重置 testSecondNumber。 在您的代码中,内部循环仅被调用一次,因为 testSecondNumber 变为 0 且未被重置。 正确的解决方案是:
public static boolean hasSharedDigit(int firstNumber, int secondNumber) {
if ((firstNumber < 10 || firstNumber > 99) || (secondNumber < 10 || secondNumber > 99)) {
return false;
}
int testFirstNumber = firstNumber;
while (testFirstNumber != 0) {
int testSecondNumber = secondNumber;
while (testSecondNumber != 0) {
if ((testFirstNumber % 10) == (testSecondNumber % 10)) {
return true;
}
testSecondNumber /= 10;
}
testFirstNumber /= 10;
}
return false;
}
似乎提供的解决方案只检查 2 位数字,因此在这种情况下性能不是问题,使用嵌套循环应该不会有任何严重影响。
但是,如果需要为任何整数(不仅是正数)找到一个公共数字,最好使用一个小数组来计算第一个数字中的数字,然后验证是否是第二个数字此数组中存在数字,没有使用嵌套循环。
static boolean commonDigits(int xx, int yy) {
// handle negative values
int x = Math.abs(xx);
int y = Math.abs(yy);
int[] digits = new int[10];
if (x == 0) { // handle 0
digits[0]++;
}
while (x > 0) {
digits[x % 10]++;
x /= 10;
}
// check for 0
if (y == 0 && digits[0] > 0) {
return true;
}
while (y > 0) {
if (digits[y % 10] > 0) {
return true;
}
y /= 10;
}
return false;
}
基于通过转换为字符串将数字转换为字符流的较短版本可能如下所示:
static boolean commonDigitsStream(int x, int y) {
int[] digits = new int[10];
Integer.toString(Math.abs(x))
.chars()
.map(i -> i - '0')
.forEach(i -> digits[i]++);
return Integer.toString(Math.abs(y))
.chars()
.map(i -> i - '0')
.anyMatch(i -> digits[i] > 0);
}