整数反转(Python and C++解法)

题目:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

示例 1:

输入: 123
输出: 321
 示例 2:

输入: -123
输出: -321
示例 3:

输入: 120
输出: 21
注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231,  231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer

思路:

可以直接辗转相除,依次获得原始数据尾巴的数字;也可以采用双指针法,跳过特殊条件。

需要考虑三处细节:1.负号;2.数字尾巴的‘0’;3.数字溢出;

Python解法:

 1 class Solution:
 2     def reverse(self, x: int) -> int:
 3         if x == 0:  # 这种情况需要特殊考虑,负责tail会数组越界
 4             return 0
 5         numStr = list(str(x))  # python的字符串不能直接操作下标,需要转换为列表
 6         lenStr = len(numStr)
 7         head = 0
 8         tail = lenStr - 1
 9         storeIndex = 0  # 记录数据除‘0’之外的末尾数字的位置
10         while numStr[head] == '-':
11             head += 1
12         while numStr[tail] == '0':
13             tail -= 1
14         storeIndex = tail
15         while head < tail:
16             numStr[head], numStr[tail] = numStr[tail], numStr[head]
17             head += 1
18             tail -= 1
19         strNum = int(''.join(numStr[:storeIndex + 1]))  # 列表需要先转换为字符串,再转换为数字
20         if strNum >= -2147483648 and strNum <= 2147483647:
21             return strNum
22         return 0

C++解法:

 1 class Solution {
 2 public:
 3     int reverse(int x) {
 4         if(x == -2147483648 || x == 2147483647)  // 当输入数字整好是边界值时,不能正确进行正负转换,需要提前判断
 5             return 0;
 6         bool flag = false;
 7         if(x < 0) {  // 转换为正数统一处理
 8             x = -x;
 9             flag = true;
10         }
11         long long num = 0;  // 不能申请为int型
12         while(x) {
13             num = num * 10 + x % 10;
14             x = x / 10;
15         }
16         if(flag)
17             num = -1 * num;
18         if(num >= -2147483648 && num <= 2147483647)
19             return num;
20         return 0; 
21     }
22 };
posted @ 2020-08-17 12:05  孔子?孟子?小柱子!  阅读(334)  评论(0编辑  收藏  举报