LeetCode算法题(二):整数反转

描述;

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

示例 1:
输入: 123
输出: 321

示例 2:
输入: -123
输出: -321

示例 3:
输入: 120
输出: 21

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

题点一:如何得到一个反转的数,可以转为字符串,也可以用数学方法计算
题点二:溢出问题该怎么判断(重点)

解法一:

class Solution {
    public int reverse(int x) {
        if (x < 10 && x> -10){
            return x;
        }
        long r;
        long result = 0;
        for (long i = 10; ;i = i * 10){
            if ((x / i) < 10 && (x / i) > -10){
                for (; i>=1;i = i /10){
                    r = x % 10;
                    result = result + r*i;
                     x = (int)(x - r) / 10;
                }
                return (int)result == result ? (int)result : 0;
            }
        }
    }
}

教训:int * int = int,不注意这点会让人疯狂

解法二(稍作优化):

class Solution {
        public int reverse(int x) {
        long n = 0;
        while(x != 0) {
            n = n*10 + x%10;
            x = x/10;
        }
        return (int) n == n ? (int) n : 0;
    }
}

上面单纯以long 与 int 是否相等来判断溢出可能会出现bug,再者题目声明只能存储32位

解法三(来自leetcode用户twobugs):

class Solution {
public int reverse(int x) {
	int result = 0;
	while (x != 0) {
	// 因为int 边界值(10位数) 的第一位只可能为1或者2,故result * 10 + result % 10 = 末位0 +末位1||2, 不可能溢出
		if ((result * 10) / 10 != result) {
			result = 0;
			break;
		}
		result = result * 10 + x % 10;
		x = x / 10;
	}
	return result;
}
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

华仔哦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值