LeetCode 7.整数反转

上一篇博客:LeetCode 3.无重复字符的最长子串(滑动窗口、双指针)

 写在前面:大家好!我是ACfun,我的昵称来自两个单词Acceptedfun。我是一个热爱ACM的蒟蒻。最近萌生了刷LeetCode的想法,所以我打算从LeetCode简单的题目开始做起,攻陷LeetCode。如果博客中有不足或者的错误的地方欢迎在评论区或者私信我指正,感谢大家的不吝赐教。我的唯一博客更新地址是:https://ac-fun.blog.csdn.net/。非常感谢大家的支持。一起加油,冲鸭!
用知识改变命运,用知识成就未来!加油 (ง •̀o•́)ง (ง •̀o•́)ง

原题链接:LeetCode 7. 整数反转

题目信息

题目描述

 给出一个 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;
    }
};

提交情况

提交情况


未完待续,持续更新中……
冲鸭!

©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页