NC57 反转数字
描述
给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231, 231 − 1] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)
数据范围:
-2 ^31 <= x <= 2 ^31-1
示例1
输入:12
返回值:21
示例2
输入:-123
返回值:-321
示例3
输入:10
返回值:1
示例4
输入:1147483649
返回值:0
思路:采用字符串的形式倒过来,最后判断形参决定是否为负数并返回。
import java.util.*;
public class Solution {
/**
*
* @param x int整型
* @return int整型
*/
public int reverse (int x) {
// write code here
if (x > Math.pow(2, 31) - 1 || x < Math.pow(-2, 31)) return 0;
String str = Math.abs(x) + "";
String val = "";
for (int i = str.length() - 1; i >= 0; i--) {
val += str.charAt(i);
}
int result = Integer.parseInt(val);
return x > 0 ? result : -result;
}
}
原因:进入Integer引用类型类中时,可以看到该类对象值为-2 ^ 31 -----2 ^ 31之间。输入是没有问题的,但是输出时,这个值就大于2 ^ 31了,因此报错。
解决方案:采用long的形式定义值,随后强制转换返回值(int)n==n?(int)n:0
但是当x = -2^ 31时,该值用Math.abs通过绝对值以后还是负数,由于变更符号导致又返回负数。
因此,判断定义为绝对值后是否为负数,若为负数则直接返回0,由于反转也还是0。
最后代码版本:
import java.util.*;
public class Solution {
/**
*
* @param x int整型
* @return int整型
*/
public int reverse (int x) {
// write code here
String str = Math.abs(x) + "";
if (x > Math.pow(2, 31) - 1 || x < Math.pow(-2, 31) || Integer.parseInt(str)<0) return 0;String val = "";
for (int i = str.length() - 1; i >= 0; i--) {
val += str.charAt(i);
}
int a=5;
long result = Long.parseLong(val);
result = x > 0 ? result : -result;
return (int)result == result ? (int)result : 0;
}
}
方法二,采用数学公式的方式。
每次都取余10表示最后一个值放在最前面。(该方法由于没有使用太多java内置函数,没有那么多坑)
import java.util.*;
public class Solution {
/**
*
* @param x int整型
* @return int整型
*/
public int reverse (int x) {
// write code here
long n = 0;
while(x!=0){
n = n*10 + x % 10;
x = x/10;
}
return (int)n==n?(int)n:0;
}
}