太菜了,好多基础的东西都不会;9.
一,
1个字节共8位,int 类型共有4个字节,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31(-INT_MAX-1).C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。
关于INT_MAX与INT_MIN的计算问题,在出现溢出时,不遵循数学计算,
INT_MAX+1 = INT_MIN,
INT_MIN - 1 = INT_MAX,
abs(INT_MIN) = INT_MIN.
二,
-7%3 = -1, 说明负数取余得到负数。
三,问题:
Given a 32-bit signed integer, reverse digits of an integer
最重要的就是解决溢出的问题,给定的 x 是 int 类型的,32位,最多只能表示到 -2^31--2^31 - 1(算上0恰好共有2^32个数,要把符号位算上),发生溢出的数,输出为0。
代码如下:对于倒序的算法很容易理解,即使是负数,或者以0为最后一个字母的数都可以解决,之所以INT_MAX/10是因为要在结束循环前一步就进行阻止。这个算法看起来还可以继续准确一下。
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x!=0){
if(abs(res)>INT_MAX/10) return 0;
res = res*10 + x % 10;
x /= 10;
}
return res;
}
};
还有一种用 long 来做的,因为 long 认为是64位,(实际上有些编译器上认为long 和 int 都是4 个字节,基本没有差别,但是这里认为是8个字节,而long long 确定是64位的,用long long 代替下面的long 也12ms过,long 和long int ,long long 和 long long int 是一回事,但是加了int 在后面以后,用了24ms是怎么回事,leetcode 应该不能用 _int64,_int64和 long long 应该是一样的)在出现题目溢出的情况时,可以用在范围内判断出来,当然,实际上还是有一点风险的,当输入的数比64位还多时,就会出现错误,代码通过:
class Solution {
public:
int reverse(int x) {
long res = 0;
while(x!=0){
res = res * 10 + x % 10;
x /= 10;
}
if(res > INT_MAX || res < INT_MIN)
return 0;
return (int)res;
}
};
两个都是12ms.