【问题标题】:Check if integer has repeating digits. No string methods or arrays检查整数是否有重复数字。没有字符串方法或数组
【发布时间】:2015-01-01 02:29:00
【问题描述】:

我正在尝试查看 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;
    }
}

}

如果运行此程序,您将看到 '2' 重复,但该方法的计算结果仍为 true,而它应该是 false

【问题讨论】:

  • 有什么问题?你的代码不能编译吗?你有例外吗?你得到不正确的值吗?你期待什么结果?为什么这样的结果应该是正确的?你得到了什么?
  • 如果 number 参数具有一位数的倍数,我似乎无法让我的 hasDistinctDigits 方法返回 false。

标签: java loops while-loop int


【解决方案1】:

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

 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。然后我们检查 numMask 中的第 5 位是否被提升:如果是,那么我们过去已经遇到过 5,因此我们可以立即判断该数字不是所有不同的数字并返回 false;否则,我们修改numMask 并提高第 5 位。

如果我们坚持到最后,则不会遇到重复数字。

【讨论】:

    【解决方案2】:

    您需要将每个数字与其他数字进行核对。这表明您应该至少有两个嵌套循环。你似乎把它们都混合了。

    为被检查的数字设置一个循环,另一个用于遍历所有其他数字。


    另外,您的 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;
        }
    }
    

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

    【讨论】:

      【解决方案3】:

      这里可以使用相同的逻辑来验证字符串是否具有唯一字符。 (1

      (result &(1

      result = result|(1

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

      【讨论】:

        【解决方案4】:
        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;
            }
        

        【讨论】:

        • 请解释您的回答对您有何帮助
        猜你喜欢
        • 2021-03-18
        • 2013-04-03
        • 2012-02-04
        • 2016-02-18
        • 2018-04-06
        • 2019-03-10
        • 2022-01-10
        • 1970-01-01
        • 2020-08-07
        相关资源
        最近更新 更多