package com.gupao.jay.pattern.singleton; /** * @Author JAY * @Date 2019/6/2 9:50 * @Description 给出一个 32 位的有符号整数,你须要将这个整数中每位上的数字进行反转。 * * 示例 1: * * 输入: 123 * 输出: 321 * 示例 2: * * 输入: -123 * 输出: -321 * 示例 3: * * 输入: 120 * 输出: 21 * 注意: * * 假设咱们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,若是反转后整数溢出那么就返回 0。 **/ public class LuTest { public static void main(String[] args) { LuTest test = new LuTest(); int x = -2147483412; System.out.println(test.reverse(x)); } public int reverse(int x) { String str = String.valueOf(x); int pow = (int) Math.pow(2, 31); int leftLimit = pow * (-1); int rightLimit = pow - 1; System.out.println(leftLimit); System.out.println(rightLimit); char[] chars = str.toCharArray(); int limit = 0; char[] newChars = null; if ('-' == chars[0]){ newChars = new char[chars.length - 1]; for (int i = 1; i < chars.length; i++){ newChars[chars.length - 1 - i] = chars[i]; } limit = leftLimit * (-1); return validateTargetNumber(newChars,limit) * (-1); }else { newChars = new char[chars.length]; for (int i = 0; i < chars.length; i++){ newChars[chars.length - 1 - i] = chars[i]; } limit = rightLimit; return validateTargetNumber(newChars,limit); } } private int validateTargetNumber(char[] newChars, int limit) { String targetStr = String.valueOf(newChars); char[] rs = filterZero(targetStr); boolean isOut = checkOutInt(limit, rs); if (isOut){ return 0; } String valueOf = String.valueOf(rs); return Integer.valueOf(valueOf); } private char[] filterZero(String targetStr) { if (targetStr.length() == 1 && "0".equals(targetStr)){ char[] chars = new char[1]; chars[0] = '0'; return chars; } //过滤前面位置为0的数字 char[] number = targetStr.toCharArray(); //前面位置是0的长度 int zeroLength = 0; for (int i = 0; i < number.length; i++){ if ('0' != number[i]){ break; } zeroLength++; } char[] rs = new char[number.length - zeroLength]; for (int i = zeroLength; i < number.length; i++){ rs[i - zeroLength] = number[i]; } return rs; } private boolean checkOutInt(int limit, char[] rs) { //将过滤掉0以后的数字进行越界判断 String limitStr = String.valueOf(limit); if (rs.length > limitStr.length()){ //越界 return true; } if (rs.length < limitStr.length()){ //未越界 return false; } //若是数字长度相等,则判断是否越界 char[] limitChars = limitStr.toCharArray(); for (int j = 0; j < limitChars.length; j++){ //结果数字每一个位置上的数字必须小于等于limit的每一个位置上的数字 if(rs[j] > limitChars[j]){ //越界 return true; }else if(rs[j] < limitChars[j]){ //不越界 return false; } } return false; } }