LeetCode刷题之数学问题(持续更新)

1. 整数反转

7. 整数反转

给定一个 32 位有符号整数,将整数中的数字进行反转。

示例 1:

输入: 123
输出: 321

 示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

public class Solution {

    public int reverse(int x) {
        long z = x;
        String str = String.valueOf(Math.abs(z));
        StringBuilder conStr = new StringBuilder();
        int len = str.length();
        while (len > 0) {
            conStr.append(str.charAt(len - 1));
            len--;
        }
        Long l = Long.parseLong(conStr.toString());
        if (l > Integer.MAX_VALUE) {
            return 0;
        }
        if (x >= 0) {
            return l.intValue();
        } else {
            return -l.intValue();
        }
    }
}

2. 回文数

9. 回文数

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

示例 1:

输入: 121
输出: true

示例 2:

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

示例 3:

输入: 10
输出: false
解释: 从右向左读, 为 01 。因此它不是一个回文数。

进阶:

你能不将整数转为字符串来解决这个问题吗?

public class Solution {
    /*
    方法1:普通解法(反转字符串)
        直接转变成字符串s,反转s得到s1,判断是否相等;
     */
    public boolean isPalindrome(int x) {
        String s = Integer.toString(x);
        String s1 = new StringBuffer(s).reverse().toString();
        if (s.equals(s1)) return true;
        return false;
    }
    /*
    方法2:进阶解法(数学方法)
        通过取整和取余操作获取整数中对应的数字进行比较
        举个例子:1221 这个数字
            通过计算 1221 / 1000, 得首位1
            通过计算 1221 % 10, 可得末位 1
            进行比较
            再将 22 取出来继续比较
     */
    public boolean isPalindrome1(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:进阶解法(数字巧妙处理)
        利用回文数的规律,将数字进行对折后看能否一一对应。
        注意:
        回文数的位数可奇可偶,当它的长度是偶数时,它对折过来应该是相等的;
        当它的长度是奇数时,那么它对折过来后,有一个的长度需要去掉一位数(除以 10 并取整)。
     */
    public boolean isPalindrome2(int x) {
        if (x < 0 || (x % 10 == 0 && x != 0)) {  //负数或者末尾为零的正数
            return false;
        }
        int revertedNumber = 0;
        while (x > revertedNumber) {
            revertedNumber = revertedNumber * 10 + x % 10;
            x /= 10;
        }
        return x == revertedNumber || x == revertedNumber / 10;
    }
}

3. 只出现一次的数字

136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例 1:

输入: [2,2,1]
输出: 1

示例 2:

输入: [4,1,2,1,2]
输出: 4

public class Solution {
    //思路:
    //使用异或运算符(异或运算符是把两个数转换成为二进制,然后进行每一位进行异或操作,相同为0,不同为1)
    public int singleNumber(int[] nums) {
        int num = 0;
        for(int i = 0; i < nums.length; i++) {
            num ^= nums[i];
        }
        return num;
    }
}

 

你可能感兴趣的:(LeetCode)