zoukankan      html  css  js  c++  java
  • 9.回文数Java版,每日一题系列(此题来自力扣网)

    9.回文数Java版,每日一题系列(此题来自力扣网)

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

    示例1:

    输入: 121
    输出: true

    示例2:

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

    示例3:

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

    方法一:普通解法

    思路

    将整数转换为字符串,然后将字符串分割成数组,循环数组的一半长度进行判断对应元素是否相等即可。

    方法一:代码

    ///简单粗暴,看看就行
    class Solution {
       public boolean isPalindrome(int x) {
           //当x小于0和尾数为0的时候直接可以false
           if (x < 0 || (x % 10 == 0 && x != 0)) {
               return false;
          }
           //x+""是将整数转字符串,reverse()是字符串反转
           String reversedStr = (new StringBuilder(x + "")).reverse().toString();
           //将x+""字符串和reversedStr字符串进行对比,相等返回true,不相等返回false
           return (x + "").equals(reversedStr);
      }
    }

    方法二:进阶解法-数学解法

    通过取整和取余操作获取整数中对应的数字进行比较。

    举个例子:1221这个数字。

    • 通过计算1221/1000,得到首位1;

    • 通过计算1221%10,得到末位1;

    • 进行比较;

    • 再将百位2和十位2取出继续比较。

    方法二:代码

    class Solution {
       public boolean isPalindrome(int x) {
           //当x小于0和尾数为0的时候直接可以false
           if (x < 0 || (x % 10 == 0 && x != 0)) {
               return false;
          }
           int div = 1;
           //用while循环计算出最大的div,如1221可计算div=1000
           while (x / div >= 10) {
               div *= 10;
          }
           while (x > 0) {
               //得到最左边的数字如left=1221/1000=1
               int left = x / div;
               //得到最右边的数字如right=1221%10=1
               int right = x % 10;
               //进行判断如果此时左右两边数不相等直接返回false
               if (left != right) {
                    return false;
              }
               //然后获取剩下的数字,1221%1000=221,221/10=22。x现在为22
               x = (x % div) / 10;
               //x缩短两位数,所以div要除以100也缩短两位数。
               div /= 100;
          }
           return true;
      }
    }

    方法三:进阶解法-巧妙解法

    这个方法就是取出后半段数字进行翻转,然后在和原来前半段数字进行对比。

    注意

    回文数可奇可偶,如果偶数长度直接取半。如果奇数取半的同时要/10取整。

    做法如下:

    • 每次进行取余操作%10,取出最低的数字:y=x%10;

    • 将最低的数字加到取出数的末尾:revertNum=revertNum*10+y;

    • 每取一个最低数字,x都要自除以10;

    • 判断x是不是小于revertNum,当它小于的时候,说明数字已经对半或者过半了;

    • 最后,判断奇偶情况:如果是偶数的话,revertNum和x相等;如果是奇数的话,最中间的数字就在revertNum的最低位上,将它除以10以后应该和x相等。

    方法三:代码

    class Solution {
       public boolean isPalindrome(int x) {
           //当x小于0和尾数为0的时候直接可以false
           if (x < 0 || (x % 10 == 0 && x != 0)) {
               return false;
          }
           int revertedNumber = 0;
           //1.判断x是否大于revertedNumber,假设x为12321
           while (x > revertedNumber) {
               //2.将x最后一位取出,并反转反转放入revertedNumber中,revertedNumber=0*10+12321%10=0+1=1
               //4.revertedNumber=1*10+1232%10=10+2=12
               //5.revertedNumber=12*10+123%10=120+3=123
               revertedNumber = revertedNumber * 10 + x % 10;
               //3.将x缩短一位x现在为1232,继续循环判断x是否大于revertedNumber
               //5.x=123,再次判断
               //6.x=12,不满足x>revertedNumber循环结束。
               x /= 10;
          }
           //因为x为奇数所以要去掉revertedNumber中的最后一位数在进行对比。
           return x == revertedNumber || x == revertedNumber / 10;
      }
    }

    作者:MisterBooo 链接:https://leetcode-cn.com/problems/palindrome-number/solution/dong-hua-hui-wen-shu-de-san-chong-jie-fa-fa-jie-ch/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    Codeforces 798C
    Codeforces 798B
    Codeforces 798A
    HDU
    HDU
    HDU
    加速cin的技巧
    Codeforces Gym
    Codeforces Gym
    Solutions to an Equation LightOJ
  • 原文地址:https://www.cnblogs.com/wjmmt/p/12869186.html
Copyright © 2011-2022 走看看