Leetcode Q7 整数翻转 Reverse Integer

题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

  • 示例 1:

    输入: 123
    输出: 321

  • 示例 2:

    输入: -123
    输出: -321

  • 示例 3:

    输入: 120
    输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

自解

用StringBuilder Hold住翻转的字符 然后String to Int

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public int Reverse(int x)
{

if (x < 10 && x > -10) return x;

var s = new StringBuilder();
if (x < 0) s.Append("-");
if (x == int.MinValue) return 0;
x = Math.Abs(x);
while (x >= 10)
{
s.Append(x % 10);
x /= 10;
}

s.Append(x);
var v = long.Parse(s.ToString());
if (v >= int.MaxValue || v <= int.MinValue) return 0;
return (int) v;

}

问题

  • Value was either too large or too small for an Int32.

给定int值1534236469翻转后9646324351超出了int32可以Hold的范围了,所以给换成long了

  • Negating the minimum value of a twos complement number is invalid.

int 的正负值范围是: -2,147,483,648 to 2,147,483,647 所以把MinValue取Math.Abs时候超出范围了.

正解

正解没用String转直接判断了

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}

难理解的也就是 两个判断的部分了

  • rev > Integer.MAX_VALUE/10

这个是针对 rev = rev * 10 + pop; 这步已经完成的值了 如果大于 Integer.MAX_VALUE/10 则 * 10以后 一定溢出了

  • rev == Integer.MAX_VALUE / 10 && pop > 7

7 和 -8 的原因是因为 int的Range -2,147,483,648 to 2,147,483,647 两个尾数一个是-8 一个是 7 所以求余得到的值如果比这俩值大 则也一定溢出

槽点

  • int 的Range + - 之间差了一位
  • Parse时候需要用long,因为不能TryParse会溢出
  • Parse以后的结果也有可能超过int的上下限
坚持原创技术分享,您的支持将鼓励我继续创作!