一、整数反转
1.1 个人思考过程
初解:出现ERROR,数据溢出的情况下应该返回0。(错误)
int reverse(int x){int y=0;while(x!=0){y=y*10+x%10;x/=10; }return y; }
再解:加上数据溢出判断条件。(正确)
int reverse(int x){int y=0;int max=pow(2,31)-1;int min=pow(-2,31);while(x){if((y>max/10)||(y<min/10))return NULL;y=y*10+x%10;x=x/10;}return y; }
1.2 力扣官方解答
int reverse(int x) {int rev = 0;while (x != 0) {if (rev < INT_MIN / 10 || rev > INT_MAX / 10) {return 0;}int digit = x % 10;x /= 10;rev = rev * 10 + digit;}return rev;
}作者:力扣官方题解
链接:https://leetcode.cn/problems/reverse-integer/solutions/755611/zheng-shu-fan-zhuan-by-leetcode-solution-bccn/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
官方答案与个人解答的区别在:INT_MIN和INT_MAX
INT_MIN和INT_MAX是C语言中定义的两个预处理宏,表示整型变量(int)的最小值和最大值。
INT_MIN表示int类型的最小值,即最小的有符号整数。在标准库头文件<limits.h>中定义为-2147483648。
INT_MAX表示int类型的最大值,即最大的有符号整数。在标准库头文件<limits.h>中定义为2147483647。
这两个宏在日常编程中很有用,可以用于判断整型变量的范围,防止溢出或其他错误。例如,如果一个整型变量的值超过INT_MAX,就说明超出了int类型能表示的范围。
二、回文数
2.1 个人思考过程
初解:出现ERROR,使用int会出现溢出,但只要是使用基本数据类型就会有数据溢出问题。如何解决?(错误)
bool isPalindrome(int x) {int a=x;int y=0;while(x!=0){y=y*10+x%10;x/=10; }if((a>=0)&&(a==y)){return true;}else{return false;} }
再解:解不出来了,看到评论区讲可以将数字截成两半进行对比,我写不出代码,不知道是否可行。 (可行,官方答案就是这个思路)
2.2 力扣官方解答
bool isPalindrome(int x) {if(x<0||(x%10==0&&x!=0)){//整数首位必不为零,负数必非回文数return false;}int revertedNumber=0;while(x>revertedNumber){//巧妙的判断方式revertedNumber=revertedNumber*10+x%10;x/=10;}return x==revertedNumber||x==revertedNumber/10;
}
我们如何知道反转数字的位数已经达到原始数字位数的一半?
由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。
2.3 进阶:整数转字符串
进阶:你能不将整数转为字符串来解决这个问题吗?
(未完待续)