每日算法----回文数----2020/09/22

1. 回文数题目描述

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

2. 示例

在这里插入图片描述

3. 思路
  • 回文数,最高位必定等于最低位。第二高位和第二地位必定相等。依次类推。
  • 负数必不为回文数。
4. 遇上的问题
  • 一开始不想转成String数组,又没有考虑到回文数中隐含的特点------回文数以中间分开两边的值是相等的。
  • 找不到思路最终还是转成了数组进行判断。
5. 具体实现代码
  • 方法1:自己写的
class Solution {
     public  boolean isPalindrome(int x) {
     	//写了一个判断传进来的数有几位的方法 
        int size =size(x);
        if(x<0) return false;
        if(x<10) return true;
        int arr[] = new int[size];
        //将传进来的数,拆分传进数组中
        for (int i = 0;i<size;i++){
            arr[i]=x%10;
            x /= 10;
        }
        //让数组进行前后对比
        for (int i = 0;i<size/2;i++){
            if (arr[i]!=arr[size-i-1])
                return false;
        }
        return true;
    }
    //借鉴的是Integer底层中toString中用到的方法,
    //通过一个静态数组来判断传进来的数的大小从而返回对应的位数
    static int[] sizeTable={9,99,999,9999,99999,999999,9999999,99999999,999999999,Integer.MAX_VALUE};
    static int size(int x){
        for (int i=0 ;;i++){
            if(x<=sizeTable[i]){
                return  i+1;
            }
        }
    }
}

在这里插入图片描述

  • 方法二,通过后参考他人的算法

  • 借助了LinkedList的方法,但是时间上并不允许,总会超出时间限制

  • 可是问题是别人提交后允许时间是8ms,我明白思路后自己写的,后来又和源码进行比对,甚至改成一模一样都是超过时间限制。

class Solution {
     public  boolean isPalindrome(int x) {
     	//小于0时固定不是回文数
         if (x<0) return false;
        LinkedList<Integer> list = new LinkedList<Integer>();
        //将数拆分存放到list中
        while(x != 0){
            list.addFirst(x%10);
            x = x/10;
        }
        //在list中进行比对,第一个和最后一个不同时返回false,
        //相同时,判断剩余个数,比两个多要进行去出首尾已经对比过的数
        //剩余一个时说明其他的数已经对比完毕,只是因为传进来的回文数是位数是单数,有剩余一位,直接返回true。
        while(!list.isEmpty()){
            if (list.getFirst() != list.getLast()){
                return false;
            }
            if (list.size()>2){
                list.removeFirst();
                list.removeLast();
            }
            if (list.size()==1){
                return true;
            }
        }
        //在list对比过程中没有返回false,说明全部对比都成功。返回true
        return true;
    }
}
  • 方法三:官方解法,最为致命。
public  boolean isPalindrome(int x) {
		//负数均不为回文数
        if(x<0){
            return false;
        }
        //个位数均为回文数
        if(x<10)
            return true;
        //非个位数能整除0无余数的必不为回文数,因为最高位不可能为0
        if (x%10==0){
            return  false;
        }
        int copyX =0;
        //思维:若为回文数,从中间切开
        //		假设位数为双数,必定前面值等于后面值
        //		假设位数为单数,则去除中间数,比较两边值
        while(true){
            copyX = copyX*10 + (x % 10);
            x = x/10;
            if (copyX<x)
                continue;
            if (copyX == x)
                return true;
            if (copyX > x){
                copyX = copyX/10;
                if (copyX == x)
                    return true;
                else
                    return false;
            }
        }
    }

在这里插入图片描述

6. 学习收获,官方一如既往的妙啊
  • 回文数的中间 分开,两边的值是相同的啊!真的是那一层窗户纸揭开就会很妙,这就是算法吗?官方解法是真的妙。
  • 想去改进算法,但是撞了一头,不过也还是会继续想要改进算法,提高自己的敏锐度啊!
7 题目来源

leetCode


点点滴滴,如金色玫瑰花瓣,洋洋洒洒铺落心间。------swrici

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值