CleanCodeHandbook Chapter 2: Math(17-19)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011732358/article/details/85042046

Math

leetcode7. Reverse Integer

Easy题目
题目链接
题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
思路:用while循环,对数不断取余就行,然后生成新数,只需要注意下 不要越界即可

class Solution {
    public int reverse(int x) {
        int ans = 0;
        while(x != 0){
            if(Math.abs(ans) > 214748364){
                return 0;
            }
            ans = ans * 10 + x % 10;
            x = x / 10;
        }
        return ans;
    }
}

leetcode66. Plus One

题目链接
题目:给定一个由整数组成的非空数组所表示的非负整数,在该数的基础上加一。
最高位数字存放在数组的首位, 数组中每个元素只存储一个数字。
你可以假设除了整数 0 之外,这个整数不会以零开头。

示例 1:
输入: [1,2,3]
输出: [1,2,4]
解释: 输入数组表示数字 123。
示例 2:
输入: [4,3,2,1]
输出: [4,3,2,2]
解释: 输入数组表示数字 4321。
思路:从后向前遍历,用flag作为进位标志位,并且初始化为1。最后一位数字加一后,若大于9 则 flag=1;否则 flag = 0,并跳出循环。若flag为0,说明该数字总位数未变,直接返回digits,否则说明该数字总位数增1,则需要新建数组,并首位置1。

class Solution {
    public int[] plusOne(int[] digits) {
        int len = digits.length;
        int flag = 1;//进位标志位
        for(int i = len - 1; i >=0; i--){
            if(digits[i] + flag > 9){
                digits[i] = 0;
                flag = 1;
            }else{
                digits[i]++;
                flag = 0;
                break;
            }
        }
        if(flag != 0){
            int[] ans = new int[len + 1];
            ans[0] = 1;
            return ans;
        }
        return digits;
    }
}

leetcode9. Palindrome Number

题目链接
判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

示例 1:
输入: 121
输出: true
示例 2:
输入: -121
输出: false
解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。

思路:用数组把数字的各位记录下来,然后比较各位是否符合要求,很暴力

public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }
        int digits[] = new int[30];
        int i = 0;
        while(x != 0){
            digits[i] = x % 10;
            i++;
            x /= 10;
        }
        for(int j = 0; j < i / 2; j++){
            if(digits[j] != digits[i - j - 1]){
                return false;
            }
        }
        return true;
    }

别人思路:分别找出数字的第一位和最后一位进行比较,然后如果两者相等,则把原数去除这两位,继续上述操作。

class Solution {
    public boolean isPalindrome(int x) {
        if(x < 0){
            return false;
        }
        int div = 1;
        int l, r;
        while(x / div > 9){
            div *= 10;
        }
        while(x != 0){
            l = x / div;//记录首位
            r = x % 10;//记录末位
            if(l != r){
                return false;
            }
            x = x % div / 10;
            //去除首部和尾部
            div /= 100;
        }
        return true;
    }
}

猜你喜欢

转载自blog.csdn.net/u011732358/article/details/85042046