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

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


题目描述

在这里插入图片描述


数组法

做题思路

一个通俗易懂的做题方法就是,将数字的每一位存到数组里,然后利用双指针对数组进行遍历,进而判断是否为回文数。
在这里插入图片描述

题目代码

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;
    }
}

巧解法

做题思路

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

在这里插入图片描述

题目代码

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题目整理出来,由浅入深,由简到繁都整理出来是一个宏大的工程,所以我打算每天整理一到两个经典题目,完成这一个流程我相信肯定会收获巨大的。如果想一起刷题的哥们,我们可以一起在群里打卡,共同进步。

在这里插入图片描述
在这里插入图片描述

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

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108954046