java算法学习笔记之整数翻转

本文介绍了一种在Java中实现整数反转的算法,通过数学运算而非类方法完成。讨论了如何避免整数溢出,并提供了两种解决方案:在溢出前判断和在溢出后判断。适用于初学者理解整数反转的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java算法学习笔记基于LeeCode

  • 题目描述:

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

示例 1:

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

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

输入: 120
输出: 21
注意:

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

初学java的小白一个,一直想用各种类方法去做这道题,没想过用数学的思路去解决,怪我太笨。。
讲的不好的地方,希望各位大佬多多指点下。

  • 解题思路:
    题目要求,输入负数,也要输出一个符号相同数字相反的整数,输入一个结尾带0的整数输出却不带0,由此可以想到,我们构建一个整型范围内的数字ans,去存目标的符号相同数字相反的整数。
    关键代码如下:
int temp = x % 10;
x /= 10;
ans = ans * 10 + temp; 

因为翻转数字有这么一个问题,翻转后的数字容易溢出,所以我们还要对ans进行判断,那么如何去判断呢,有两个办法。

  • 1:在整型变量ans溢出之前判断;

我们知道int 整型范围为(-2,147,483,648,2,147,483,647),在java中可以用Integer类中MAX_VALUE和MIN_VALUE代替;
因为 ans = ans*10+temp
如果刚好溢出了,就一定有ans*10+temp>Integer.MAX_VALUE,
两边同时除以10,就剩下ans>Integer.MAX_VALUE/10;
temp/10<1
,在整型中变为了0
如果ans==Integer.MAX_VALUE呢,temp就一定要小于7了,
就相当于2,147,483,640+temp;负数也一样,照理推理就好。
所以判断代码如下:

  if (ans > Integer.MAX_VALUE/10 || (ans == Integer.MAX_VALUE / 10 && temp > 7)) return 0;
  if (ans < Integer.MIN_VALUE/10 || (ans == Integer.MIN_VALUE / 10 && temp < -8)) return 0;
  • 2:在溢出后再判断;
    这个方法就简单许多了,我们只要将ans定义为long类型再判断是否大于Integer.MAX_VALUE就行,记得最后要强制类型转换,因为题目要求返回一个int类型的。
    下面是两种方法的完整代码:
    public int reverse(int x) {
        int ans = 0;
        while (x != 0) {
            int temp = x % 10;
            x /= 10;
            if (ans > Integer.MAX_VALUE/10 || (ans == Integer.MAX_VALUE / 10 && temp > 7)) return 0;
            if (ans < Integer.MIN_VALUE/10 || (ans == Integer.MIN_VALUE / 10 && temp < -8)) return 0;
            ans = ans * 10 + temp;
        }
        return ans;
    }
public  int reverse(int x) {
	        long ans = 0;
	        while (x != 0) {
	            int temp = x % 10;
	            x /= 10;
	            ans = ans * 10 + temp;
	            if(ans>Integer.MAX_VALUE||ans<Integer.MIN_VALUE)
	            	return 0;
	        }
	        int ans1 = (int)ans;
	        return ans1;
	    }

初学的小白,之前也想过用异常直接return 0的,但只是听别的大佬说过…我还没学到…
end…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值