【leetcode】每日精选题详解之9. 回文数(经典)

        嗨,大家好,我是袁厨(因为酷爱做饭,所以自己考取了厨师证)。之前一直看大家写的博客,学到了很多东西。然后最近萌生了自己写的想法,将自己知道的分享给需要的同学。以后每天会为大家分享leetcode精选题目的各种题解和Python, JS, JQ, CSS, PHP, JAVA的一些小Demo。请大家关注我,一起交流学习吧。


9. 回文数

  • 题目描述
  • 数组法
    • 做题思路
    • 题目代码
  • 字符串法
    • 做题思路
    • 题目代码
  • 数学法
    • 做题思路
    • 题目代码
  • 巧解法
    • 做题思路
    • 题目代码
  • 总结

题目描述

【leetcode】每日精选题详解之9. 回文数(经典)_第1张图片


数组法

做题思路

一个通俗易懂的做题方法就是,将数字的每一位存到数组里,然后利用双指针对数组进行遍历,进而判断是否为回文数。
【leetcode】每日精选题详解之9. 回文数(经典)_第2张图片

题目代码

class Solution {
     
    public boolean isPalindrome(int x) {
     
        //如果为负数,则不是回文数,这里还可以添加一个就是尾数为0的情况.
        if(x < 0){
     
            return false;
        }
        //构建一个动态数组
        List<Integer> array = new ArrayList<>();
        //将某一位添加到动态数组
        while(x > 0){
                
            array.add(x%10);
            x/=10;
        }
        int i = 0;
        int j = array.size()-1;
        //双指针遍历
        while(i<j){
     
            if(array.get(i) != array.get(j)){
     
                return false;
            }else{
     
                i++;
                j--;
            }
            
        }
        return true;

    }
}

        


字符串法

做题思路

我们可以先将该数字转为字符串,然后再进行遍历字符串,因为java里面有很多函数可以达到这个目标,所以我们也可以这样完成。

题目代码

class Solution {
     
    public boolean isPalindrome(int x) {
     
     //如果为负数,则不是回文数,这里还可以添加一个就是尾数为0的情况.
       if(x<0){
     
           return false;
       }     
       //将其转化为字符串,注意这个函数的用法  
       String t = Integer.toString(x);
       int i = 0;
       int j = t.length()-1;
       //双指针遍历
       while(i<j){
     
           if(t.charAt(i)!=t.charAt(j)){
     
               return false;
           }
           else{
     
               i++;
               j--;
           }
       }
       return true;
    }
}

数学法

做题思路

这个方法也比较同意想到和容易理解,但是代码实现有一些难度,主要思路是给出一个数,然后我们得出数的第一位和最后一位。最后一位比较容易想到对10取余即可,那第一位应该怎么得到呢?比如1001,我们得到1可以通过1001%10==1;第一位的话可以通过1001/1000得到。即为1,然后每次缩小所除的数,一次缩小两位,则除100。但是这个方法效率不是特别高。

题目代码

class Solution {
     
    public boolean isPalindrome(int x) {
     
           if(x<0){
     
               return false;
           }
           int pro =1;
           //这一步用来求第一位的值的除数。比如1001/1000==1,
           //我们可以通过这个循环得到1000;
           while(x/pro>=10){
     
               pro*=10;
           }
           System.out.println(pro);
           while(x>0){
     
               int first = x / pro;
               int last  = x % 10;
               if(first!=last){
     
                   return false;
               }
               //这里是用来去掉首尾两位的情况
               x=(x%pro)/10;
               //缩小最大除数,因为是减少两位,所以是除100;
               pro/=100;

           }
            return true;
    }
}

巧解法

做题思路

这个方法比较巧妙,也是运用到了数学知识,主要思路就是将一个数的后半部分取出来,将尾部变为头部,然后和第一个数进行比较。但是我们会遇到两种情况一种是,数字为为奇数,一种是数字位数为偶数,所以我们需要返回两种情况 下图则为解题思路

【leetcode】每日精选题详解之9. 回文数(经典)_第3张图片

题目代码

class Solution {
     
    public boolean isPalindrome(int x) {
     
    // 这里就需要完全加入尾数为0的情况了,因为靠下面的while不能去除尾数为0的情况
         if(x < 0 || (x%10 == 0 && x!=0)){
     
              return false;
          }
          int renum = 0;
          while(x > renum){
     
             //流程图内容
              renum = renum * 10 + x % 10;
              x/= 10;
          }
          //位数为奇偶的两种情况
          return renum == x || renum/10 == x;
    }
}

总结

这个题目算是很经典的题目,应该还有其他方法,如果大家还有其他方法希望大家可以不吝赐教。感谢

作者:LeetCode
链接:https://leetcode-cn.com/problems/rotate-array/solution/xuan-zhuan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(leetcode每日精选,leetcode,算法,数据结构,字符串)