【问题标题】:checking an integer to see if it contains a zero检查一个整数以查看它是否包含零
【发布时间】:2011-04-20 08:02:31
【问题描述】:

给定一个整数,如何使用 Java 检查它是否包含 0?

1 = 好 2 = 好 ... 9 = 好 10 = 糟糕! 101 = 糟糕! 1026 = 糟糕! 1111 = 好

如何做到这一点?

【问题讨论】:

    标签: java parsing integer


    【解决方案1】:

    你的意思是十进制表示是否包含0?这样做的绝对最简单方法是:

    if (String.valueOf(x).contains("0"))
    

    不要忘记,一个数字不会“固有地”包含 0 或不包含(当然,零本身除外) - 它取决于基数。所以十进制的“10”是十六进制的“A”,十六进制的“10”是十进制的“16”……在这两种情况下,结果都会改变。

    可能有更有效的方法来测试整数十进制表示中是否存在零,但它们可能比上面的表达式涉及更多。

    【讨论】:

    • +1 - 我会在生产代码中使用这个解决方案,直到有人向我证明a)它是一个瓶颈,b)另一个解决方案明显更快。为了简单性和可读性,有很多话要说。
    【解决方案2】:

    如果由于某种原因您不喜欢转换为字符串的解决方案,您可以尝试:

    boolean containsZero(int num) {
        if(num == 0)
            return true;
    
        if(num < 0)
            num = -num;
    
        while(num > 0) {
            if(num % 10 == 0)
                return true;
            num /= 10;
        }
        return false;
    }
    

    这也假设 num 是基数 10。

    编辑:添加了处理负数和 0 本身的条件。

    【讨论】:

      【解决方案3】:

      您可以将其转换为字符串并检查它是否包含字符“0”。

      int number = 101;
      if( ( "" + number ).contains( "0" ) ) {
        System.out.println( "contains the digit 0" );
      }
      

      【讨论】:

      • 我真的不喜欢 "" + x 将值转换为字符串的方式。它根本没有清楚地表达意图 - 毕竟你对concatenation并不真正感兴趣......你在conversion之后。当然只是 MHO。
      • 我承认,这很丑。但这很容易记住。
      • String.valueOf() 是不是更难记住?
      【解决方案4】:

      Integer.toString(yourIntValue).contains("0");

      【讨论】:

        【解决方案5】:

        这是一个用于检测整数中的零的例程。要使其适用于任何表示形式(十进制、十六进制、八进制、二进制),您需要将基数作为参数传入。

        public static boolean hasZero(int num, int base) {
            assert base > 0 : "must have positive non-zero base";
        
            if (num == 0)
                return true;
        
            while(num != 0) {
                if (num % base == 0) {
                    return true;
                }
                else {
                    num = num / base;
                }
            }
        
            return false;
        }
        
        public static void main(String args[]) {
            System.out.println(hasZero(10, 10));  // true (base 10 int)
            System.out.println(hasZero(-12, 10));  // false (base 10 int)
        
            System.out.println(hasZero(0x10, 16)); // true (hex is base 16)
            System.out.println(hasZero(0x1A, 16)); // false (hex is base 16)
        }
        

        【讨论】:

        • 几乎重复上面的答案
        【解决方案6】:

        我不知道这是否更容易,但这是另一种方式。 将数字拆分为整数数组。然后排序并检查第一个元素是否为零。 例如

        int n = 14501;
        // after splitting
        int na = {1, 4, 5, 0, 1};
        // after sorting
        int na = {0, 1, 1, 4, 5};
        

        【讨论】:

          【解决方案7】:

          不使用 Java,但从 C++ 转换并不难 PS。任何使用字符串转换的人都感到羞耻。

          bool Contains0InBase10( unsigned int i, unsigned int& next )
          {
           unsigned int divisor = 10;
           unsigned int remainder = 0;
           while( divisor <= i )
           {
            unsigned int newRemainder = i%divisor;
            if( newRemainder - remainder == 0)
            {
             // give back information allowing a program to skip closer to the next
             // number that doesn't contain 0
             next = i + (divisor / 10) - remainder;
             return true;
            }
            divisor *= 10;
            remainder = newRemainder;
           }
           return false;
          }
          

          【讨论】:

          • 虽然这个算法本质上可能比字符串转换更有效,但稍微解释一下为什么模运算符会做 OP 正在寻找的东西可能会澄清你的帖子。
          猜你喜欢
          • 2014-09-04
          • 1970-01-01
          • 2023-03-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-03-29
          • 1970-01-01
          • 2019-08-25
          相关资源
          最近更新 更多