本文已参与「新人创作礼」活动,一起开启掘金创作之路。
题目连接: leetcode.com/problems/re…
1. 题目介绍
Given a signed 32-bit integer x, return x with its digits reversed. If reversing x causes the value to go outside the signed 32-bit integer range [-2^31^, 2^31^ - 1], then return 0.
【Translate】: 给定一个带符号的32位整数x,返回x并反转其数字。如果反转x值超出有符号32位整数范围[-2^31^, 2^31^ - 1],则返回0。
Assume the environment does not allow you to store 64-bit integers (signed or unsigned).
【Translate】: 假定环境不允许存储64位整数 (signed or unsigned).
测试用例:
约束:
2. 题解
2.1 StringBuilder反转后转型 -- O(n)
这一题相对于其它Medium属于比较简单的。整体要求就是给出一个整形数字,把它反转输出即可。它的难度在于,如何做到最快。我的这个想法是属于比较简单大众的,就是先将整形数字转型成字符串进行存储,然后按位取出存入字符数组,同时借助了StringBuilder的插入函数,可以将‘-’号拆入首部,最后判断一下是否越界即可。
class Solution {
public int reverse(int x) {
String s = String.valueOf(x);
char[] arr = s.toCharArray();
StringBuilder sb = new StringBuilder();
for(int i = s.length()-1; i >= 0; i--)
{
if (arr[i] == '-')
{
sb.insert(0, arr[i]);
}else{
sb.append(arr[i]);
}
}
System.out.println(sb);
long l = Long.parseLong(sb.toString());
// 判断是否越界
if (l < -Math.pow(2, 31) || l > Math.pow(2, 31) - 1) {
return 0;
}
return (int)l;
}
}
如果不对其进行越界判断,就会出现以下错误,且不符合题目要求
2.2 极致精简
题解来源于力扣(07)一道简单题引起的一系列问题,通过对x的取余,我们可以从小到大一步一步得到想要的数字,然后让n*10,直到x为0。最后根据条件表达式,判断是否越界。确实NB!!!
public static int reverse(int x) {
long n = 0;
while (x != 0) {
n = n * 10 + x % 10;
x /= 10;
}
return (int) n == n ? (int) n : 0;
}
3.可参考
[1] Java StringBuffer insert()方法
[4] 在 Java 中添加字符到字符串