LeetCode 7.整数反转(转载)

原题链接: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;
}
};
提交情况

原文链接:https://blog.csdn.net/qq_41575507/article/details/108022964?utm_medium=distribute.pc_feed.none-task-blog-cf-2.nonecase&depth_1-utm_source=distribute.pc_feed.none-task-blog-cf-2.nonecase&request_id=5f43960ccea070620e93ecb8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值