🌟Leetcode exercise record🌟 1
🙊 TOP100 easy 2
Q&A 整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路:
通过取余得到个位,并通过不断扩大10倍和对10取整,使个位换到高位,并使要翻转的对象位移到低位
👉rs*10+x%10,x/=10
知识补充
🙊2^31-1=2147483647
-2^31=2147483648
🙊java里面直接溢出不会报异常
两个数相加溢出只会变成负数。不会异常
💭Language:C C++ Java
**🍓🍓WAY1 C language **
int reverse(int x){
int max = 0x7fffffff, min = 0x80000000;//int的max min
long rs = 0;//用long类型判断溢出
for(;x;rs = rs*10+x%10,x/=10);//逆序,正负通吃,不用单独考虑负值,类似while(x) x==0时结束循环
return rs>max || rs<min?0:rs;//超过max,min返回0
}
**🍓🍓WAY2 C language **
int reverse(int x){
long rs = 0;
while(x!=0){
rs = rs * 10 + x % 10;
x = x / 10;
}
if((int)rs != rs){//rs为long型,记录实际值
//(int)rs将rs强制转换为int型如果值过大,会变成溢出之后的值,此时实际值不再与long型相等,若没溢出,两者会相等
return 0;
}
else{
return (int)rs;
}
}
**🍓🍓WAY3 Java language **
class Solution {
public int reverse(int x) {
long re = 0; // 防止反转后超出int的范围
do{
re = re * 10 + x % 10;
x = x / 10;
}while(x != 0);
if (re > Integer.MAX_VALUE || re < Integer.MIN_VALUE) // 若超出范围 返回0
return 0;
else
return (int)re;
}
}
**🍓🍓WAY4 C++ language **
class Solution {
public:
int reverse(int x) {
if(x == INT_MIN || x == INT_MAX) return 0;
long long ans = 0;
while(x != 0){
ans = ans * 10 + x % 10;
x /= 10;
}
if(ans < INT_MIN || ans > INT_MAX)return 0;
return (int)ans;
}
};