【LeetCode】回文数

    技术2022-07-12  80

    个人博客:https://jacob.org.cn

    package leetcode.editor.cn; //判断一个整数是否是回文数。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。 // // 示例 1: // // 输入: 121 //输出: true // // // 示例 2: // // 输入: -121 //输出: false //解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。 // // // 示例 3: // // 输入: 10 //输出: false //解释: 从右向左读, 为 01 。因此它不是一个回文数。 // // // 进阶: // // 你能不将整数转为字符串来解决这个问题吗? // Related Topics 数学 public class 回文数 { public static void main(String[] args) { Solution solution = new 回文数().new Solution(); System.out.println(solution.isPalindrome(-121)); System.out.println(solution.isPalindrome(121)); System.out.println(solution.isPalindrome(10)); } //leetcode submit region begin(Prohibit modification and deletion) class Solution { /** * 方案四:折半法 * 每次进行取余操作 ( ),取出最低的数字:y = x % 10 * 将最低的数字加到取出数的末尾:reverseNumber = reverseNumber * 10 + y * 每取一个最低位数字,x 都要自除以 10 * 判断 x 是不是小于 reverseNumber ,当它小于的时候,说明数字已经对半或者过半了 * 最后,判断奇偶数情况:如果是偶数的话,revertNum 和 x 相等;如果是奇数的话,最中间的数字就在revertNum 的最低位上,将它除以 10 以后应该和 x 相等。 * @param x * @return */ public boolean isPalindrome(int x) { if (x < 0 || (x % 10 == 0 && x != 0)) { return false; } int reverseNumber = 0; while (x > reverseNumber) { reverseNumber = reverseNumber * 10 + x % 10; x = x / 10; } return x == reverseNumber || x == reverseNumber / 10; } } //leetcode submit region end(Prohibit modification and deletion) /** * 方案一:数字反转 * * @param x * @return */ public boolean isPalindrome1(int x) { if (x < 0) { return false; } int temp = x; int x2 = 0; while (temp > 0) { int var = temp % 10; if (x2 > Integer.MAX_VALUE / 10 || (x2 == Integer.MAX_VALUE / 10 && var > 7)) { return false; } if (x2 < Integer.MIN_VALUE / 10 || (x2 == Integer.MIN_VALUE / 10 && var < -8)) { return false; } x2 = x2 * 10 + var; temp = temp / 10; } if (x == x2) { return true; } return false; } /** * 方案二:字符串反转 * * @param x * @return */ public boolean isPalindrome2(int x) { String number = String.valueOf(x); String reverseNumber = new StringBuffer(number).reverse().toString(); return number.equals(reverseNumber); } /** * 方案三:数学解法 * 思路:高位和低位进行比较。 * * @param x * @return */ public boolean isPalindrome3(int x) { int div = 1; if (x < 0) { return false; } // 获取数字最高位数 eg:121 div:100 while (x / div > 10) { div = div * 10; } // while (x > 0) { int right = x % 10; int left = x / div; if (right != left) { return false; } x = (x % div) / 10; // 每次比较是两位,除 100 div = div / 100; } return true; } }
    Processed: 0.014, SQL: 9