原题链接:LeetCode 7. 整数反转
文章目录
题目信息
题目描述
示例
示例 1
示例 2
示例 3
注意
题解
解题思路
解题代码
提交情况
题目信息
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例
示例 1
输入: 123
输出: 321
示例 2
输入: -123
输出: -321
示例 3
输入: 120
输出: 21
注意
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题解
解题思路
我们可以将每一个整数 x 利用对 10 取模进行拆开,然后将每一位存到数组 q[] 中。存到数组中之后我们再定义一个 ans 变量来存储反转后的数字,我们可以从数组q[i]的第一个数字 q[0] 开始(即原数字的个位数),然后遍历循环整个数组,每次都执行 ans = ans * 10 + q[i] 。这样我们就可以每次将当前数字扩大10倍然后加上下一位数字,相当于将这一串数字向左移动了一位然后加上了新的数字。循环完成后我们发现原来的个位数由于每次的乘 10 操作成了最高位,原来的最高位由于是最后加上的所以成为了个位。
图解
这里要注意 整型变量int 的数据范围为 -2147483648 ~ +2147483647 (4 Bytes)。所以我们的 ans 变量要定义为长整形变量 long,在力扣的编辑器中长整形 long 的字节数为 8 位,数据范围为-9223372036854775808 ~ +9223372036854775807 (8 Bytes)。这样我们就不用担心因输入 2147483647 这样的大数进行反转的时候出现数据溢出的情况了。(有关其他变量的数据范围请阅读 C/C++ 各种变量的数据范围)
还要注意一点就是 while(n) 等价于 while( n != 0),不要理解成了while( n > 0)了。所以如果输入的是一个负数,也是可以进行拆解的,虽然拆解之后每一位都是负数,但是执行 ans = ans * 10 + q[i] 每一次都会是负数并不会改变反转后的正负。
解题代码
class Solution {
public:
int reverse(int x) {
long ans = 0;
int q[32] = {0};
int n = x, i = 0;
while (n) {
q[i] = n % 10;
n /= 10;
i++;
}
for (int j = 0; j < i; j++) {
ans = ans * 10 + q[j];
}
if (ans < -pow(2, 31) || ans > pow(2, 31) - 1) {
ans = 0;
}
return ans;
}
};
提交情况