优解
//给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
//
// 示例 1:
//
// 输入: 123
//输出: 321
//
//
// 示例 2:
//
// 输入: -123
//输出: -321
//
//
// 示例 3:
//
// 输入: 120
//输出: 21
//
//
// 注意:
//
// 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
// Related Topics 数学
// 👍 2291 👎 0
package leetcode.editor.cn;
//Java:整数反转
public class P7ReverseInteger {
public static void main(String[] args) {
Solution solution = new P7ReverseInteger().new Solution();
// TO TEST
int reverse = solution.reverse(1534236469);
System.out.println(reverse);
}
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public int reverse(int x) {
int res = 0;
while (x != 0) {
int temp = x % 10;
if (res > Integer.MAX_VALUE / 10 || (res == Integer.MAX_VALUE && temp > 7)) return 0;
if (res < Integer.MIN_VALUE / 10 || (res == Integer.MIN_VALUE && temp < -8)) return 0;
res = res * 10 + temp;
x /= 10;
}
return res;
}
}
//leetcode submit region end(Prohibit modification and deletion)
}
时间复杂度O(log(n)),空间复杂度O(1)
劣解
class Solution {
public int reverse(int x) {
int[] split = split(x);
int[] reverse = reverse(split);
int merge = merge(reverse);
return merge;
}
//O(log(n))
public int[] split(int x) {
int len = x > 0 ? String.valueOf(x).length() : String.valueOf(x).length() - 1;
int[] ints = new int[len];
int i = len - 1;
while (x != 0) {
ints[i--] = x % 10;
x /= 10;
}
return ints;
}
// O(n)
public int[] reverse(int[] split) {
for (int i = 0; i < split.length / 2; i++) {
swap(split, i, split.length - 1 - i);
}
return split;
}
// O(n)
public int merge(int[] array) {
int sum = 0;
for (int i = 0; i < array.length; i++) {
double dueSum = (array[i] * Math.pow(10, array.length - i - 1));
if (sum + dueSum <= Integer.MAX_VALUE && sum + dueSum >= Integer.MIN_VALUE)
sum += array[i] * Math.pow(10, array.length - i - 1);
else return 0;
}
return sum;
}
public void swap(int[] array, int i, int j) {
int temp = array[i];
array[i] = array[j];
array[j] = temp;
}
}