题目一览
解题思路
首先这是一个easy的题目,但是我太菜了,也是第一次刷leetcode,时隔两年A题,所以是一个零基础的小白,各种东西都不清楚,做了好久…
这道题的解题思路其实很简单,我们只要把每一位的数字取下来然后依次作为返回结果的由高到低的每一位数字即可,思路虽然很简单,但是其实题目真正考察的是计算机补码这个知识点,那么不妨让我们简单回顾一下计算机编码的相关知识:
计算机编码
原码
第一位表示符号(0表正数,1表负数),其余位表示数值。因为第一位是符号位,所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111] 即 [-127 , 127] ,原码是容易被人脑所理解的表达方式。
反码
正数的补码反码是其本身,负数的反码是** 符号位保持不变,其余位取反**。例如正数1的原码是[0000 0001],它的反码是是其本身[0000 0001],-1的原码是[1000 0001],其反码是[1111 1110]
补码
正数的补码是其本身,负数的补码是在其反码的基础上+1,例如正数1的原码是[0000 0001],他的补码是其本身[0000 0001],-1的补码是[1111 1111]
而我们计算机中采用的是补码的方式来存储,所以题目中的要求是数值范围为[
−
2
31
-2^{31}
−231,
2
31
−
1
2^{31}-1
231−1],根据我上面说的补码的规则,我们知道最小为[0x8000 0000],最大为[0x7fff ffff]。这时我们就需要考虑一种情况,当我们最大的正数翻转过来时就会造成溢出,因为本来我们的正数翻转过来应该是正数,但是由于前面有一位符号位存在,所以就会造成我们的符号位被置1,int类型显然不能够满足我们程序的要求,所以这题应该采用long long类型。至此,我们的问题就解决了,下面附上我的程序代码。
程序代码
class Solution {
public:
int reverse(int x) {
long long result = 0;//保存程序最后结果
int maxint=0x7fffffff;//int型最大能够保存的数字
int minint=0x80000000;//int型能保存的最小的负数
while(x != 0){
result = 10 * result + (x % 10);
x = x / 10;
}
if(result<minint||result>maxint){
result=0;
}
return result;
}
};
总结
计算机组成原理不能丢,对于A题来说,程序编码的相关知识还是很重要的,建议忘记的同学可以回去补一补。