LeetCode100道 day03

77 阅读1分钟

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));
    }
}