LeetCode100道 day03
1. 整数反转
-
给你一个 32 位的有符号整数
x,返回将x中的数字部分反转后的结果。 -
如果反转后整数超过 32 位的有符号整数的范围
[−231, 231 − 1],就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
class Solution {
public int reverse(int x) {
long n = 0;
while(x != 0) {
n = n*10 + x%10;
x = x/10;
}
return (int)n==n? (int)n:0;
}
}
2. 字符串转换整数 (atoi)
- 垃圾题目,写了很多都过不了,设计有问题,无他,只有借鉴,希望下一次能更好
输入: s = "42" 输出: 42 解释: 加粗的字符串为已经读入的字符,插入符号是当前读取的字符。 第 1 步:"42"(当前没有读入字符,因为没有前导空格) ^ 第 2 步:"42"(当前没有读入字符,因为这里不存在 '-' 或者 '+') ^ 第 3 步:"42"(读入 "42") ^ 解析得到整数 42 。 由于 "42" 在范围 [-231, 231 - 1] 内,最终结果为 42
class Solution {
public int myAtoi(String s) {
int n = s.length();
if(n == 0) {return 0;}
//去前导空格,t为去除空格的字符串部分
int i = 0;
while(i < n){
if(s.charAt(i) != ' ') {break;}
++i;
}
String t = s.substring(i, n);
if(t.length() == 0) {return 0;}
//处理正负号。sig标记正负号,index为数字计算起点(也就是用index处理是否存在正负号)
int sig = 1, index = 0;
if(t.charAt(0) == '+' || t.charAt(0) == '-'){
sig = (t.charAt(0) == '+') ? 1 : -1;
index++;
}
//计算数字,res存储累计结果。
//Character.isDigit()工具方法,判断是否数字,昨天碰见的现学现用。直接ascii码判断也一样。
int res = 0;
while(index < t.length() && Character.isDigit(t.charAt(index))){
int isOverBounds = res;
//sig保证res正负值正确
res = (res * 10 + sig * (t.charAt(index) - '0'));
//判定溢出,分别指定正负溢出结果
if(res / 10 != isOverBounds){
res = sig < 0 ? -2147483648 : 2147483647;
break;
}
index++;
}
return res;
}
}
3. 回文数
- 给你一个整数
x,如果x是一个回文整数,返回true;否则,返回false。
回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- 只用了一行就解决了问题,感慨算法的奇妙 reverse()
class Solution {
public boolean isPalindrome(int x) {
return new StringBuilder(String.valueOf(x)).reverse().toString().equals(String.valueOf(x));
}
}