leetcode 之 Reverse Integer
2017-09-13 23:27
337 查看
题目如下:
Example 1: x = 123, return 321;
Example 2: x = -123, return -321;
Attention:The reversed integer might overflow. Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows.
Note: The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
第一种解法:
先把 integer 转换成 string, 然后把 string 的每个元素倒置,最后再把string转换成int,在转换的时候要考虑溢出,如果溢出返回0;因为int本身就为32位,所以我们表示范围可以用常量INT_MIN和INT_MAX表示。代码如下:
分析:将整数转换为string直接调用函数to_string(),是c++11的新添加的标准。string的倒置的操作为线性复杂度,至于string转换为int,也是用了一个for循环,也是线性的复杂度。总的来说复杂度应为O(n);
第二种解法:
不需要int与string之间的转换,直接利用算术方法将整数的各位倒置。
分析:首先声明了一个long型变量用于存放结果,因为结果可能溢出,所以用int可能会出错。先判断符号,如果是负数那么先变号,等其他位都倒置后再把负号还原。用一个循环将位数倒置,最后返回值判断结果是否溢出,如果溢出返回0,否则返回正确结果。算法复杂度也为O(n)。
Example 1: x = 123, return 321;
Example 2: x = -123, return -321;
Attention:The reversed integer might overflow. Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows.
Note: The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.
第一种解法:
先把 integer 转换成 string, 然后把 string 的每个元素倒置,最后再把string转换成int,在转换的时候要考虑溢出,如果溢出返回0;因为int本身就为32位,所以我们表示范围可以用常量INT_MIN和INT_MAX表示。代码如下:
class Solution { public: int reverse(int x) { int sign; string temp = to_string(x); int n = temp.size(); string cp_temp; if(temp[0] != '-') { sign = 1; for (int i = n - 1; i >= 0; i--) { cp_temp += temp[i]; } } else { sign = -1; cp_temp += '-'; for (int i = n - 1; i > 0; i--) { cp_temp += temp[i]; } } int num = 0; int mark = (cp_temp == '-' ? 1 : 0); for (; mark < cp_temp.size(); mark++) { if(num > INT_MAX / 10 || (num == INT_MAX / 10 && (cp_temp[mark] - '0') > INT_MAX % 10)) { return 0; } num = num * 10 + cp_temp[mark] - '0'; } return num * sign; } };
分析:将整数转换为string直接调用函数to_string(),是c++11的新添加的标准。string的倒置的操作为线性复杂度,至于string转换为int,也是用了一个for循环,也是线性的复杂度。总的来说复杂度应为O(n);
第二种解法:
不需要int与string之间的转换,直接利用算术方法将整数的各位倒置。
class Solution { public: int reverse(int x) { long num = 0; int sign = 1; if(x < 0) { sign = -1; x = -1 * x; } while(x) { num = num * 10 + x % 10; x = x / 10; } num = num * sign; return (num > INT_MAX || num < INT_MIN) ? 0 : num; } };
分析:首先声明了一个long型变量用于存放结果,因为结果可能溢出,所以用int可能会出错。先判断符号,如果是负数那么先变号,等其他位都倒置后再把负号还原。用一个循环将位数倒置,最后返回值判断结果是否溢出,如果溢出返回0,否则返回正确结果。算法复杂度也为O(n)。
相关文章推荐
- LeetCode(5):Reverse Integer
- Leetcode 7 Reverse Integer
- LeetCode - Reverse Integer
- 【leetcode】Reverse Integer
- LeetCode-Reverse Integer
- LeetCode-7:Reverse Integer
- LeetCode | Reverse Integer
- leetcode 第7题 Reverse Integer
- LeetCode Reverse Integer
- LeetCode 7:Reverse Integer
- leetcode 104: Reverse Integer
- LeetCode——Reverse Integer
- [LeetCode]Reverse Integer
- [LeetCode] Reverse Integer
- LeetCode7 Reverse Integer
- leetcode[7]Reverse Integer
- leetcode-Reverse Integer
- LeetCode解题-#7-Reverse Integer
- LeetCode : Reverse Integer
- leetcode笔记:Reverse Integer