Leetcode题库 7. 整数反转
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [− 2 31 2^{31} 231, 231-1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
我的思路
题目要求把输入的整数反转,我就想,能不能从个位到高位依次把每一位存入一个数据结构当中,然后把数字从低位到高位依次取出,重新拼接成一个整数。因此这个数据结构要求,先存入的先取出来,即先入先出,需要队列来实现。
java 中 LinkedList 有队列的功能,因此利用 LinkedList 实现题目要求。
我的程序(Java)
import java.util.LinkedList;
class Solution {
public int reverse(int x) {
LinkedList<Integer> ints = new LinkedList<Integer>();
int n = x;
while(n!=0)
{
ints.offer(n % 10); // 把整数从低位到高位依次存入LinkedList
n = n / 10;
}
if(ints.peek()==null) return 0; // 题目测试的时候,没加这行,会出现 java.lang.NullPointerException 错误
n = ints.poll(); // 前面已经保证 LinkedList 有数据,取出原来的最低位,最为现在的最高位
while(ints.peek()!=null)
{
if((n > Integer.MAX_VALUE/10) || (n < Integer.MIN_VALUE/10)) // 判断是否溢出,若溢出,则返回0
return 0;
n = n*10 + ints.poll();
}
return n; // 未溢出,返回结果
}
}
官方解题思路
参考链接:官方解题
和我的思路类似,但是更加简便,没有用队列,直接在大循环里面依次取出整数(x)的最后一位,然后放到新数字(rev)的个位。新数字增加一位,意味着原来的新数字(rev)要乘以10,可能会产生溢出。因此,在乘以10之前,先判断是否可能溢出。判断溢出的条件(假设x为正整数):
1.rev > Integer.MAX_VALUE/10 一定溢出
2.rev == Integer.MAX_VALUE/10 并且 pop > 7 一定会溢出
负整数类似,不再赘述。
官方程序样例(Java)
class Solution {
public int reverse(int x) {
int rev = 0;
while(x!=0)
{
int pop = x % 10; // 取出x的最后一位
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;
x = x / 10;
rev = rev * 10 + pop;
}
return rev;
}
}
小知识(取余的定义)
a % b的余数定义是(a/b)*b + a % b恒等于a。
例如-14/3和14/-3的商都是-4,但-14 % 3 是-2,而 14 % -3是2。
我们可以拿上面的公式验证一下:(-14/3)*3 + (-2) = -14, (14/-3)*(-3) + 2 = 14 都满足上面的条件
后记
目前,本人正在学习数据结构,偶尔会做一下Leetcode上的题库,如果上面的解题有哪些错误,欢迎指正。也欢迎读者与我交流学习,共同进步。