1.整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。 如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。 环境不允许存储 64 位整数(有符号或无符号)。 leetcode 7
输入:x = 120 输入:x = -123输出:21 输出:-321
取余除10,不断缩小
- -4444 % 10 = -4 正数负数的终止条件一致
- 当达到最大值的1/10时,就要提前判断,是否溢出;同理,到最小值的1/10时也要提前判断防溢出。
- 溢出情况j简化考虑:因为x本身会被int限制,当x为正数并且位数和Integer.MAX_VALUE的位数相等时首位最大只能为2,所以逆转后不会出现res = Integer.MAX_VALUE / 10 && tmp > 2的情况,自然也不需要判断res==214748364 && tmp>7了,反之负数情况也一样


class Solution {public int reverse(int x) {int res = 0;while(x != 0){int tmp = x % 10;if (res > Integer.MAX_VALUE / 10 || res < Integer.MIN_VALUE / 10) {return 0;}//判断是否 大于 最大32位整数//if (res>214748364 || (res==214748364 && tmp>7)) {// return 0;//}//判断是否 小于 最小32位整数//if (res<-214748364 || (res==-214748364 && tmp<-8)) {// return 0;//}res = res * 10 + tmp;x /= 10;}return res;}}
2.回文整数
给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。 回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121 是回文,而 123 不是。 leetcode 9
字符串反转(略)
对半反转整数
- 结束条件:res > x
判断条件:res == x(偶数位情况) x == res / 10 (奇数位情况) 121 -> res :12 x :1
class Solution {public boolean isPalindrome(int x) {if(x < 0 || x % 10 == 0 && x != 0) return false;int res = 0;while(x > res){res = res * 10 + x % 10;x /= 10;}return res == x || x == res / 10;}}
拆出最高位和最低位比较
public boolean isPalindrome(int x) {//边界判断if (x < 0) return false;int div = 1;//while (x / div >= 10) div *= 10; // 求出位数while (x > 0) {int left = x / div;int right = x % 10;if (left != right) return false;x = (x % div) / 10;div /= 100; // 两位两位的缩减规模}return true;}
3.字符串转整数
实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数)。考虑溢出情况 leetcode 8
溢出判断:last != res / 10
更新res 后计算后立即判断,否则跨循环判断 idx可能溢出,导致返回错误的res结果
public int myAtoi(String s) {char[] chars = s.toCharArray();int len = chars.length;//1.去空格int index = 0;while (index < len && chars[index] == ' ')index++;//2.排除极端情况 " "if (index == len) return 0;//3.设置符号int sign = 1;char firstChar = chars[index];if (firstChar == '-') {index++;sign = -1;} else if (firstChar == '+') {index++;}int res = 0, last = 0; //last 记录上一次的res,以此来判断是否溢出while (index < len) {char c = chars[index];if (c < '0' || c > '9') break;int tem = c - '0';last = res;res = res * 10 + tem;// 计算后立即判断,否则idx可能溢出,导致返回错误的res结果if (last != res / 10) ////如果不相等就是溢出了return (sign == (-1)) ? Integer.MIN_VALUE : Integer.MAX_VALUE;index++;}return res * sign;}
