检查整数是否有重复数字。没有字符串方法或数组

时间:2014-11-05 01:01:41

标签: java loops while-loop int

我试图查看int是否具有相同数字的倍数。尝试不使用字符串方法或数组。我遇到问题的主要方法是hasDistinctDigits()。它在重复数字结束时起作用,但在它们出现在开头或中间时不起作用。

public static void main(String[] args) {
    System.out.println(hasDistinctDigits(12234));
}

public static boolean hasDistinctDigits(int number) {
    boolean returner = true;
    int count = 1;
    int newNum = number;
    int digit = 0;

    while (count < numDigits(number)) {         
        while (count < numDigits(newNum)) {
            digit = newNum % 10;
            newNum/=10;
            if (digit == getDigit(newNum, count)) {
                returner = false;
            }
            count++;                
        }
        count++;
    }
    return returner;
}

public static int numDigits(int number) {
    int count = 0;
    while (number != 0) {
        number /= 10;
        count++;
    }
    return count;
}

public static int getDigit(int number, int i) {
    int digit = 0;
    int count = 0;
    int originalNum = number;

    while (count <= i) {
        if (count == i) {
            digit = number % 10;
        }
        number /= 10;
        count++;
    }
    if (i > numDigits(originalNum)) {
        return -1;
    } else {
        return digit;
    }
}

}

如果这样,你会看到&#39; 2&#39;重复自己,但该方法仍应评估为true何时应为false

4 个答案:

答案 0 :(得分:4)

这是一个简短而甜蜜的版本:)

 private static boolean hasDistinctDigits(int number) {
     int numMask = 0;
     int numDigits = (int) Math.ceil(Math.log10(number+1));
     for (int digitIdx = 0; digitIdx < numDigits; digitIdx++) {
         int curDigit = (int)(number / Math.pow(10,digitIdx)) % 10;
         int digitMask = (int)Math.pow(2, curDigit);             
         if ((numMask & digitMask) > 0) return false;
         numMask = numMask | digitMask;
     }
     return true;
 }

它以非常简单的方式工作。 numMask是一个整数,用于存储已遇到的数字(因为十进制系统编号只有10位数,一个整数使用16位,我们有足够的位来存储每个十进制数字)。

我们遍历数字中的所有数字。对于每个数字索引,我们得到curDigit中的实际数字。我们说当前数字是5。然后我们检查它在第3位被引出numMask:如果是,那么我们过去已经遇到5,所以我们可以立即告诉该数字没有所有不同的数字并返回false;否则,我们修改numMask并提高第5位。

如果我们到最后,那么就没有遇到重复的数字。

答案 1 :(得分:0)

您需要检查每个数字与其他数字。这表明您应该至少有两个嵌套循环。你似乎把它们混合在一起。

有一个循环用于检查数字,其他用于迭代所有其他数字。


此外,您的getDigit方法无效。 替换为

public static int getDigit(int number, int i) {
    int digit = 0;
    int count = 0;
    int originalNum = number;

    while (count <= i) {
        if (count == i) {
            digit = number % 10;
        }
        number /= 10;
        count++;
    }
    if (i > numDigits(originalNum)) {
        return -1;
    } else {
        return digit;
    }
}

希望这会有所帮助。 祝你好运。

答案 2 :(得分:0)

可以在此处使用相同的逻辑来验证字符串是否具有唯一字符。 (1&lt;&lt; currentChar),它将currentChar中的位设置为1等于该索引处出现的数字(0-9),并将所有其他位设置为0.

(结果&amp;(1&lt;&lt; currentChar):如果位已设置为1则返回false 其他

result = result |(1&lt;&lt; currentChar):设置结果整数中的位,该位等于该索引处的数字。

public class CheckIfDigitsAreRepeated {


        public static void main(String[] args) {
            int input = 1234567897; // false
            // int input = 1234567890;  true

            System.out.println(hasDistinctDigits(input));
        }

        public static boolean hasDistinctDigits(int input){
            int result = 0;

            String inputString = String.valueOf(input);


            for (int i=0; i < inputString.length();i++){

                int currentChar = inputString.charAt(i)- '1';

                if((result &(1 << currentChar)) > 0){
                    return false;
                }

                result = result|(1 << currentChar);

        }

            return true;
        }
    }

答案 3 :(得分:0)

public static boolean hasDistinctDigits(int number) {
         int numMask = Math.floorMod(number, 10);
         int numDigits = (int) Math.ceil(Math.log10(number+1));
         for (int digitIdx = 0; digitIdx < numDigits; digitIdx++) {
             int curDigit = (int)(number / Math.pow(10,digitIdx)) % 10;
             if(numMask != curDigit)  return false;
             numMask = numMask & curDigit;
         }
         return true;
    }