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/314/-3的商都是-4,但-14 % 3-2,而 14 % -32。
我们可以拿上面的公式验证一下:(-14/3)*3 + (-2) = -14, (14/-3)*(-3) + 2 = 14 都满足上面的条件

后记

目前,本人正在学习数据结构,偶尔会做一下Leetcode上的题库,如果上面的解题有哪些错误,欢迎指正。也欢迎读者与我交流学习,共同进步。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值