LeetCode - Reverse Integer
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode - Reverse Integer相关的知识,希望对你有一定的参考价值。
题目的要求就是要反转一个Integer,例如输入123,则输出321,这一题比较tricky的地方就是它有可能越界,就是说1234567899,反过来是9987654321是一个越界的Integer,按照题目要求,碰到越界返回0,就好。关键的地方就在于,怎么判断它是否越界呢?一开始为了处理这个越界的问题,我才用了一个大小为10的int数组来存每一位,通过处理最高位来判断是否越界,后来发现有更为简单的方法,代码量要小很多,但是两者在速度上并没有什么太大的区别,代码如下:
1 //思路:用数组去存位数,再翻转。 2 public class Solution { 3 public int reverse(int x) { 4 if (x == 0) return 0; 5 int[] num = new int[10]; 6 int index = 0; 7 //x2用来判断x是大于0还是小于0。 8 int x2 = x; 9 while (x != 0) { 10 num[index++] = x % 10; 11 x = x / 10; 12 } 13 int reverseNum = num[0]; 14 for (int i = 1; i < index; i++) { 15 //注意溢出的情况,不能直接乘以10,因为这样子不能通过正负号判断是否溢出, 16 //在刚好溢出的时候,最大的变化就是正负号的转变,所以得一个一个加。 17 if (i == 9) { 18 for (int j = 0; j < 9; j++) { 19 reverseNum += reverseNum; 20 if (reverseNum < 0 && x2 > 0) return 0; 21 if (reverseNum > 0 && x2 < 0) return 0; 22 } 23 reverseNum += num[i]; 24 } else { 25 reverseNum = reverseNum * 10 + num[i]; 26 } 27 } 28 return reverseNum; 29 } 30 }
后来发现了一个更为简洁的方法,那就是延长输入为long,这样子就不需要判断最高位,直接通过x是否越过Integer的最大最小值就可以判断出来。代码如下:
1 public class Solution { 2 public int reverse(int x) { 3 long reverseNum = 0; 4 while (x != 0) { 5 reverseNum = 10 * reverseNum + (long)x % 10; 6 x = x/10; 7 } 8 if (reverseNum > (long)Integer.MAX_VALUE || reverseNum < (long)Integer.MIN_VALUE) return 0; 9 else return (int) reverseNum; 10 } 11 }
相当简洁。但是如果速度影响不太多的情况下,本人还是倾向于第一种,因为延长Integer to long,总感觉是一种比较tricky的方法,如果输入的不是int x而是long x呢?或者说输入的是一个位数非常大的数字呢?
以上是关于LeetCode - Reverse Integer的主要内容,如果未能解决你的问题,请参考以下文章