给出一个32位的有符号整数,将这个正数每位上的数字进行反转。输入:123 输出: 321
输入:-123 输出:-321
输入:120 输出: 21 // 首位非0,数值溢出返回0。
逆序输出问题,也是一个首位交换问题,两端分别对应位置的数字进行交换。
方案一:逆序输出
整数转字符串,字符串转数组
数据结构:字符数组
遍历
方案二:首尾交换
整数转字符串,字符串转数组
数据结构:字符数组
遍历
解法一:暴力解法
1、整数转字符串,再转字符数组
2、反向遍历字符数组,并将元素存储到新数组中
3、将新数组转成字符串,再转成整数输出
边界问题:
1、数组索引越界
2、数值溢出边界:溢出则返回0
javaclass Solution {
public int reverse(int x) {
if (x == Integer.MIN_VALUE) {
// 整数类型的最小值的绝对值要比最大值大1
return 0;
}
int sign = x > 0 ? 1 : -1;
x = x < 0 ? -x : x;
// 1、整数转字符串
String str = String.valueOf(x);
char[] chars = str.toCharArray();
// 2、反向遍历字符数组,并将元素存储到新的数组中
int len = chars.length;
char[] array = new char[len];
for (int i = 0; i < len; i++) {
array[len - 1 - i] = chars[i];
}
// 3、将数组转成字符串,再转成数字
long value = Long.valueOf(String.valueOf(array));
return (value > Integer.MAX_VALUE || value < Integer.MIN_VALUE) ? 0 : (int)value * sign;
}
}
解法二:首尾交换
1、整数转字符串,再转字符数组
2、交换首位和末位数字
3、循环操作:依次交换第二个和倒数第二个,知道数组剩下1个或0个
4、将原数组转成字符串,再转成整数输出
边界问题:
数组索引越界,数组长度为偶数,反转完成标志位start > end;为奇数时,反转完成标志位 start == end。
数组溢出边界,溢出则返回0;
javaclass Solution {
public int reverse(int x) {
if (x == Integer.MIN_VALUE || x == Integer.MAX_VALUE) return 0;
int sign = x > 0 ? 1 : -1;
x = x < 0 ? -x : x;
String str = String.valueOf(x);
char[] chars = str.toCharArray();
int start = 0, end = chars.length - 1;
while (start < end) {
char tmp = chars[start];
chars[start] = chars[end];
chars[end] = tmp;
start++;
end--;
}
long value = Long.valueOf(String.valueOf(chars));
return (value > Integer.MAX_VALUE || value < Integer.MIN_VALUE) ? 0 : (int)value * sign;
}
}
本文作者:whitebear
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!