LeetBook乐扣题库 9. 回文数

一 题目描述

给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。

回文数

是指正序(从左向右)和倒序(从右向左)读都是一样的整数。

  • 例如,121 是回文,而 123 不是。

示例 1:

输入:x = 121
输出:true

示例 2:

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

示例 3:

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

二 两个方法代码

public class LeetBook9 {
    public boolean isPalindrome(int x) {
        if (x < 0){//筛选掉负数能节省一点点点的内存空间
            return false;
        }

        String xToStr = Integer.toString(x);//或者用String.valueOf(x); 将数字转为字符串

        StringBuffer sb = new StringBuffer(xToStr);
        String reverseX = sb.reverse().toString();//实现字符串的反转

        return reverseX.equals(xToStr);
    }

    public boolean isPalindrome2(int x) {
        if (x < 0){
            return false;
        }

        int temp = x;
        int y = 0;
        while(temp != 0){
           y = y * 10 + temp % 10;;//注意是x的个位成y的最高位,所以每一次都应该给其升位
            temp = temp / 10;
        }

        return x == y;
    }
}

三 遇到的一些问题

1.反转字符串 - isPalindrome

   我尝试使用StringBuffer来将int转为string,然后通过reverse函数来直接反转,我认为这样会更加便捷(如果是负数,负号也会转为字符串的),但是没有想到运行速度并不理想,我就在想会不会是使用StringBuffer的问题,因为使用reverse这个函数是在StringBuffer类里面的,那我想着能不能我自己实现反转。就有了以下代码(很抱歉我自己实现的reverse还是用到了StringBuffer):

public boolean isPalindrome1(int x) {
        if (x < 0){//筛选掉负数能节省一点点点的内存空间
            return false;
        }

        String xToStr = Integer.toString(x);//String.valueOf(x); 将数字转为字符串

        //两个位置箭头,表示这次需要反转哪两个位置
        //比如第一次是0和倒数第一位互换,第二次是1和倒数第二位......
        int start = 0, end = xToStr.length() - 1;
        StringBuffer sb = new StringBuffer();

        //如果start大于end,表示已经互换完了
        while (start <= end){
            if (start == end) { // 如果 start 和 end 相等,只插入一次
                sb.insert(sb.length() / 2, xToStr.charAt(start));
            } else {
                //一次会加入两个字符,在/2的情况下,insert的位置都是一样的
                //所以要先加入start再加入end,这样end的字符就会在start前面,实现了反转
                //比如一开始,sb长度为0,0/2得到的插入位置是0.此时start的字符插入到位置0
                //然后sb长度为1,1/2得到的位置是0,此时end的插入到位置0,
                //由此start就往后顺延到位置1了,实现反转
                sb.insert(sb.length() / 2, xToStr.charAt(start));
                sb.insert(sb.length() / 2, xToStr.charAt(end));
            }
            start++;
            end--;
        }

        String reverseX = sb.toString();

        return reverseX.equals(xToStr);
    }

这个代码要注意:

在while循环的if else中,由于一次会加入两个字符,在/2的情况下,insert的位置都是一样的,所以要先加入start再加入end,这样end的字符就会在start前面,实现了反转

比如一开始,此时sb长度为0,0/2得到的插入位置是0.此时start的字符插入到位置0,然后sb长度为1,1/2得到的位置是0,此时end的插入到位置0,由此start就往后顺延到位置1了,实现反转

但是结果是:时间大幅度大幅度增加,达到了11ms

于是我询问gpt给出对于StringBuffer的解释是:

  • isPalindrome的反转字符串reverse,涉及创建新的字符串对象和字符数组,这需要额外的时间和空间。其时间复杂度主要受字符串操作的影响,虽然总体为O(n),但实际操作起来更慢。
  • isPalindrome2方法则直接在整数上进行数学操作,避免了任何字符串操作,因而更加高效。其时间复杂度也是O(n),但由于仅涉及简单的算术操作,其常数时间要小得多。

2.代数运算 - isPalindrome2

这个就比较好想了,运行速度也快,只需要注意注释中的部分就好,一开始没想明白这个10的倍数关系。

x的个位成y的最高位,所以每一次都应该给其升位,即第一次运算,x的个位充当y的个位,第二次运算就要当十位,要×10,第三次相比第二次,每一位又升一位,所以再×10

四 运行结果

五 意外的一些编程格式简化思路

对于比对原来的数字和新的数字然后返回return时,一开始我还要写一个if判断返回是false还是true,后来发现,if的判断语句本来就是一个返回bool类型的式子,所以直接return这个判断式就好,即:

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值