给定一个32位的有符号整数num,将num中的数字部分反转,最后返回反转的结果
1.只反转数字部分,符号位部分不反转
2.反转后整数num超过 32 位的有符号整数的范围 [−231, 231 − 1] ,返回 0
3.假设本题不允许存储 64 位整数(有符号或无符号,即C++不能使用long long ,Java不能使用long等)
数据范围:
-231 <= x <= 231-1
12
21
-123
-321
10
1
1147483649
0
public int reverse(int num) { boolean negative = false; if (num < 0) { num = -num; negative = true; } int result = 0; while (num != 0) { int digit = num % 10; int newresult = result * 10 + digit; if (((newresult - digit) / 10) != result) { return 0; } result = newresult; num = num / 10; } if (negative) { result = -result; } return result; }
public int reverse (int x) { // write code here int num=0; while(x!=0){ int temp=num*10+x%10; if((temp-x%10)/10!=num){ return 0; } num=temp; x/=10; } return num; }
转成字符串来处理
import java.util.*; public class Solution { /** * * @param x int整型 * @return int整型 */ public int reverse (int x) { String str = "" + x; if (str.startsWith("-")) { //负数,最小值-2147483648 String noneStr = reverseStr(str.substring(1)); String aStr = "-" + noneStr; String outStr="2147483648"; if(noneStr.length()==outStr.length()&&isOutOfRange(outStr,noneStr)){ return 0; } return Integer.parseInt(aStr); } else { //正数,最大值2147483647 String b = reverseStr(str); String bigestStr = "2147483647"; if (b.length() == bigestStr.length()&&isOutOfRange(bigestStr,b)) { return 0; } return Integer.parseInt(b); } } public boolean isOutOfRange(String rangeStr, String currStr) { if(currStr.startsWith("0")){//处理特殊值,例如2147483640,倒转之后是不会越界的 return false; } for (int i = 0; i < rangeStr.length(); i++) { int num1 = Integer.parseInt("" + currStr.charAt(i)); int num2 = Integer.parseInt("" + rangeStr.charAt(i)); if (num1 > num2) { return true; } } return false; } public String reverseStr(String str) { if (str == null || str.length() == 0) { return ""; } return reverseStr(str.substring(1)) + str.charAt(0); } }
import java.util.*; public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param x int整型 * @return int整型 */ public int reverse (int x) { // write code here int tag = 1; if (x < 0) { tag = -1; x = -x; } int a = x, b = 0; while (a != 0) { if(b > Integer.MAX_VALUE / 10|| x < Integer.MIN_VALUE / 10) return 0; b = b * 10 + a % 10; a = a / 10; } return b * tag; } }
public int reverse (int x) { // write code here int m=0,n=0; while(x!=0){ m=m*10; m+=x%10; x=x/10; if(m==Integer.MAX_VALUE/10&&x%10>Integer.MAX_VALUE%10||m>Integer.MAX_VALUE/10&&x!=0||m==Integer.MIN_VALUE/10&&x%10>Integer.MIN_VALUE%10 ||m<Integer.MIN_VALUE/10&&x!=0){ return 0; } } return m; }
public int reverse (int x) { // write code here int y=0; if(x>0){ String s=x+""; String ss=new StringBuffer(s).reverse().toString(); try{ y=Integer.parseInt(ss); }catch(Exception e){ return 0; } }else if(x==0){ y=x; }else{ String s=Math.abs(x)+""; String ss=new StringBuffer(s).reverse().toString(); try{ y=(-1)*Integer.parseInt(ss); }catch(Exception e){ return 0; } } return y; }
import java.util.*; public class Solution { /** * * @param x int整型 * @return int整型 */ public int reverse (int x) { // write code here int ans = 0; while(x != 0) { if(ans >= Integer.MAX_VALUE/10 || ans <= Integer.MIN_VALUE/10) { return 0; } ans = ans*10 + x%10; x = x/10; } return ans; } }
哪有那么复杂,而且好多答案都用了long
public int reverse (int x) { // write code here final int limit = Integer.MAX_VALUE / 10; int val = 0; while (x != 0) { if (val > limit || val < -limit) return 0; val = val * 10 + x % 10; x /= 10; } return val; }
其实只有溢出需要额外判断,也就是先用 INT_MAX / 10 = 214748364 判断溢出,然后计算 val
不能先计算 val 再用 INT_MAX 和 INT_MIN 判断,因为 val 可能溢出
至于为什么不需要处理等于 214748364 的情况,因为这种情况不可能出现,假设这一轮计算得 val = 214748364x,原来的数一定是 x463847412,又因为是 32 位整数,x 只能为 0 或 1,因此 val 一定不会溢出
这网站编辑器都好难用啊
public int reverse (int x) { // write code here String origin = String.valueOf(x); //将int转化为string进行操作 String res = ""; //存放最终结果 boolean flag = false; //false代表正数 if(x == 0 || x < Integer.MIN_VALUE / 10 || x >= Integer.MAX_VALUE / 10){ return 0; } //如果是10的倍数 包括10 100 120等等 一直除以10 除到不是10的倍数就停止 if(x % 10 == 0 ){ int num = x / 10; while(num % 10 == 0){ num = num / 10; } origin = String.valueOf(num); //因为反之像120这种返回的是21 //所以还需要继续按照下面的for循环 } for(int i = 0 ; i < origin.length() ; i ++){ if(origin.charAt(i) == '-'){ flag = true; //是负数 }else{ res = String.valueOf(origin.charAt(i)) + res; } } if(flag == true){ res = "-" + res; } return Integer.parseInt(res); }
import java.util.*; public class Solution { /** * * @param x int整型 * @return int整型 */ public int reverse (int x) { int fu=x>0?1:-1; x=Math.abs(x); if(x==0)return 0; long num=0; while(x!=0){ int y= x%10; num=num*10+y; if(num>Integer.MAX_VALUE) return 0; x=x/10; } return fu*(int)num; } }
public int reverse (int x) { // write code here int reverse = 0; while(x != 0){ if (reverse > Integer.MAX_VALUE / 10 || (reverse == Integer.MAX_VALUE / 10 && x % 10 > 7)) return 0; if (reverse < Integer.MIN_VALUE / 10 || (reverse == Integer.MIN_VALUE / 10 && x % 10 < -8)) return 0; reverse = reverse * 10 + x % 10; x = x/10; } return reverse ; }
import java.util.*; public class Solution { /** * * @param x int整型 * @return int整型 */ public int reverse (int x) { String str=String.valueOf(x); char []arr=str.toCharArray(); String new_x=""; //如果溢出返回0 if(arr.length>=10){ return 0; } //使用倒序添加到新的字符串上 for(int i=arr.length-1;i>=0;i--){ new_x+=arr[i]; } //如果有负号的话,进行分割 if(new_x.contains("-")){ String [] a=new_x.split("-"); return -Integer.parseInt(a[0]); } return Integer.parseInt(new_x); } }
public int reverse (int x) { int res = 0; boolean flag = false; if(x < 0){ flag = true; x = -x; } while(x > 0){ if(res > Integer.MAX_VALUE/10 || (res == Integer.MAX_VALUE/10 && x > Integer.MAX_VALUE%10)){ return 0; } res = res * 10 + x % 10; x = x / 10; } if(flag) return -res; return res; }