【问题标题】:Finding Whether Two Numbers Share a Digit查找两个数字是否共享一个数字
【发布时间】:2021-01-31 20:15:53
【问题描述】:

我正在解决这个问题,我应该使用循环来查找两个数字是否共享一个数字。如果共享数字是数字的第一个数字,我编写的代码不会返回 true。我在我的代码或任何其他解决方案中找不到错误。请帮忙!

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;
        }

【问题讨论】:

  • 您需要将初始化testSecondNumber 的语句移到外循环内。目前你只运行一次内循环。

标签: java while-loop logic


【解决方案1】:

您应该在下一个 testFirstNumber 循环之前重置 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;
}

【讨论】:

  • 正确的解决方案是不使用println 声明。
【解决方案2】:

似乎提供的解决方案只检查 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);
}

【讨论】:

    猜你喜欢
    • 2012-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 2022-11-04
    • 2021-06-21
    • 2014-07-29
    相关资源
    最近更新 更多