【问题标题】:Reverse digits of an integer整数的反转数字
【发布时间】:2015-04-18 19:47:43
【问题描述】:

如何反转一个数字?

示例 1:x = 123,返回 321 例 2:x = -123,返回 -321

这是我的回答:

public int reverse(int x) {
    int result = 0;
    while(x != 0){
        result = result * 10 + x % 10;
        x = x / 10;
    }
    return result;
}

但是当我输入 1534236469 时,它会输出 1056389759 ,这是错误的。你觉得我的节目怎么样?谢谢。

【问题讨论】:

  • 除非需要 int,否则使用字符串作为输入。 1.检查减号是否存在,如果存在。 2. 调用 string.reverse() 3. 如果删除了减号,则添加回来

标签: algorithm


【解决方案1】:

你的程序不能给出正确答案的一个原因是你 将result 存储在int 中,但您希望能够 颠倒数字1534236469。 正确答案是 9646324351, 但该数字大于int 的最大可能值 所以你最终会得到别的东西。 尝试long long 或尝试使用不超过 9 位的输入。


跟进: 我建议long long 因为那会相当可靠地给你 一个 8 字节的整数。您还可以在 long 中获得 8 个字节,具体取决于 您在哪里构建代码, 但是 32 位 Windows(例如)上的 Visual C++ 将 只给你 4 个字节。可能 4 字节的 long 很快就会取代 2 字节的 int ,但在这个时间点上,我们中的一些人仍然需要处理它。

【讨论】:

  • 是的,你是对的,我知道数字超过了int类型,那么如何更正呢?
  • 使用 long 或等效的。但是,它仍然不会使您的代码适用于负数。
  • 负数应该用这种方法。仅当数字不超过 int 类型时
  • 看sasha的回答,有处理负数的思路。
【解决方案2】:

杰森, 您应该将类​​型从 int 更改为 long。

   public long  reverse(long x)
    {
        long result = 0;
        while (x != 0)
        {
            result = result * 10 + x % 10;
            x = x / 10;
        }
        return result;
    }

【讨论】:

  • 这不适用于负数,这是 OP 输入示例的一部分。
  • 这也取决于你运行的环境。 64 位 linux 上的 g++ 将为您提供 8 个字节到 long,Win32 上的 Visual C++ 将为您提供 4 个字节。
  • 如果输入的数字超过long类型,我认为应该是错误的。我如何捕捉溢出,如果溢出它返回 0
  • Jason ,你能解释一下你的问题吗?
  • @Fery 我的问题是当我输入 1534236469 时,结果应该是 9646324351,但这对于 int 来说是溢出的。那么我怎样才能捕获溢出并返回 0。谢谢。
【解决方案3】:

你可以写 x >0 (虽然没关系),之后你必须考虑负数,我对你的逻辑进行了如下更改(也使用 long long 以避免溢出):

      long long reverse(long long x)
      {

           int sign = 1;
           long long ans=0;
           if(x < 0)
             sign = -1;
           x = abs(x);
           while(x > 0)
           {
               ans *= 10;
               ans += x%10;
               x /=10;
           }
           return ans*sign;
      }

【讨论】:

  • OP 的问题案例是一个正数。对于正数,您的代码看起来与他的相同。它会在x=1534236469 上产生正确的结果吗?
  • @jez 也作为 OP 在示例中给出的负数,我涵盖了该案例
  • 确实,您的解决方案是正确的。但是,如果您指出您的代码与 OP 的代码之间的区别是什么,那将会很有帮助。而不是只给他们没有注释的代码(你修复了 while 错误和 sign 错误)。
  • 大卫 K 得到了答案
  • @aruisdante 抱歉匆忙写下答案,会这样做的。将进行编辑。谢谢
【解决方案4】:

如何转换为字符串并反转?很简单:

   int reverseDigits(int x) {
      String s = Integer.toString(x);
      for (int i = 0; i < s.length() / 2; i++) {
        char t = s[i];
        s[i] = s[s.length() - i - 1];
        s[s.length() - i - 1] = t;
      }
      return Integer.parseInteger(s); // subject to overflow
   }

【讨论】:

    【解决方案5】:

    可以使用long类型来存储结果

    public int reverse(int x) {
        long result = 0;
        while (x != 0) {
            result = result * 10 + x % 10;
            x /= 10;
        }
        if (result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)
            return 0;
        return (int)result;
    }
    

    【讨论】:

      【解决方案6】:

      这是一个发布在 Leetcode 上的问题,它给出了一个错误的答案,期望为 0。线索是在返回反转整数之前,我们必须检查它是否不超过 32 位 int 的限制,即 2^31 -1.

      Python 3 中的代码:

      class Solution:
      def reverse(self, x: int) -> int:
          s=[]
          rev=0
          neg=False
          if x==0:
              return 0
          if x<0:
              x=x* -1
              neg=True
          while x:
              s.append(x%10)
              x=int(x/10)
          i=len(s)
          j=0
          while i:
              rev=rev+s[j]*10**(i-1)
              i=i-1
              j=j+1
          if(rev>2**31-1):
              return 0
          return rev * -1 if neg else rev
      

      【讨论】:

        【解决方案7】:

        您正在使用 int 来存储数字,而数字超出了 int 的范围。您已在此问题中标记了算法。因此,更好的方法是使用链接列表。你可以谷歌更多关于它。有很多用于反转链表的算法。

        【讨论】:

          【解决方案8】:

          为什么不干脆做:

          while (x)
            print x%10
            x /= 10
          

          如果 x 的值最初是负数,则使用双符号转换,以避免模数是什么的问题。

          【讨论】:

            【解决方案9】:

            Schultz9999 答案的简短版本:

            int reverseDigits(int x) {
              String s = Integer.toString(x);
              s=new StringBuilder(s).reverse().toString();
              return Integer.parseInt(s); 
            }
            

            【讨论】:

              【解决方案10】:

              这里是倒数的python代码::

              n=int(input('Enter the number:'))
              r=0
              
              while (n!=0):        
                  remainder=n%10
                  r=remainder+(r*10)
                  n=n//10       
              
              print('Reverse order is %d'%r)
              

              【讨论】:

                【解决方案11】:

                一个紧凑的 Python 解决方案是

                reverse = int(str(number)[::-1])
                

                如果负数是可能的,那么

                num = abs(number)          # absolute value of the number
                rev = int(str(num)[::-1])  # reverse the number
                reverse = -rev             # negate the reverse
                

                【讨论】:

                  【解决方案12】:

                  在JS我是这样写的

                  function reverseNumber(n) {
                    const reversed = n
                      .toString()
                      .split('')
                      .reverse()
                      .join('');
                  
                    return parseInt(reversed) * Math.sign(n);
                  }
                  

                  【讨论】:

                    猜你喜欢
                    • 2013-04-15
                    • 1970-01-01
                    • 2018-09-26
                    • 2017-04-08
                    • 1970-01-01
                    • 2015-04-09
                    • 1970-01-01
                    • 1970-01-01
                    • 2017-11-18
                    相关资源
                    最近更新 更多