(力扣)LeetCode刷题之整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
卧槽,又是简单题,简单个毛线啊,对于我这种菜鸡来说,真的好难呀!!!
我的思路一开始就是笨办法,把数字转换成字符串,然后判断是否是正数,负数,最后转换以后看是否在[-2^31,2^31-1]范围内,但是好像不行啊,用什么来接收转换后的数字呢?环境只允许存储32位的有符号数,不能使用long64位的来接收啊????
力扣(LeetCode)官方给出的解题方式如下:
我勒个去啊,这TM的就是一道数学题啊!!!
理下思路吧:
官方给出的思想是“弹出”和“推入”
首先是弹出:
/pop operation: //弹出
pop = x % 10; //取余运算,得到一个数字最后一位,得到数字符号和x的一致
x /= 10; //接上步得到最后一位数字,该数字不要最后一个数字了
例如:数字3456
pop = 3456 % 10= 6
x /=10 → x = 3456/10 = 345
推入:
//push operation://推入
temp = rev * 10 + pop; //rev一开始是0
rev = temp;
例如:接上面的
temp = 6
rev = 6
重复上面的“弹出”,“推入”操作,就可以完成数字的反转
但是,问题也来了,防止溢出,所以肯定得有个条件的嘛,2^31-1的值为:2147483647,将近21亿多,当作圆周率记一下吧,要是我有这么多钱就好了,-2^31的值为:-2147483648
如果:“弹出”和“推入”得到的rev的数值>int类型的最大值/10,就不可能成功了,肯定溢出,例如:rev = 214748365,他下一次“推入”的数字不管是多少肯定比2^31-1大,
或者rev的数值=int类型的最大值/10 ,那么“弹出”的数字>7,也不行
负数的同理
总结:学渣的我能理解也不容易吧,还好数学思维好,┭┮﹏┭┮,只能慢慢来了,其他的方法以后再补充吧,感觉做这种题好烧脑啊......