力扣题——1.回文数

下面,我们来看一道力扣题

题目如下:

需求:给你一个整数x,如果整数x是一个回文数,则打印true,否则,则返回false

解释:回文数是指正序(从左往右)和倒序(从右往左)读都是一样的数

例如:12321是回文数,123不是回文数

分析:

回文数,就是正序和倒序一样的数;判断一个数是不是回文数,就是判断它的正序和倒序是不是一样的,那么关键就是求这个数的倒序数。怎么求?取余,然后再相加着求

具体怎么做?跟着我的思路走:

给你一个数x,你先让x对10取余,有了x的最后一位数,接下来怎么做?简单啊,再对100取余。正确吗?不正确,因为你对100取余得到的是后两位数。你说可以减去个位再对100取余,然后除以10啊,可以是可以,代码怎么实现?很麻烦(我测试过,写不通)

那应该怎么办呢?我们再仔细想一想。前面说了,让x对10取余得到最低位的余数,那如果我们让x减去余数,然后再除以10,然后再对10取余,不就可以得到倒数第二位的数了吗?是的,此时我们一个想到java除法运算的特性:整数除以某个数,得到的还是整数,是舍弃小数位的整数。那这样就好做多了。

我们让x对10取余,余数用一个变量保存,然后让x除以10,然后再对10取余,如此反复下去,就能得到每一位的数字了。

数字得到了,怎么相加呢?你说简单,用新得到的数字乘以10(100,1000)再加上已有的数字,这又是一个错误,你这样最后得到的数和原数是一模一样的。我们这里相加的逻辑是什么?相加的逻辑是将你最新得到的数字放到已得到数字的最右边,是最右边,是最低位,是你最先得到的数字在最高位,那怎么办?我们继续分析,我们得到的数字只是一个个的数,是个位数,个位数如果要放最右边,那前提是你前面数的最右边是0,然后直接相加就行,怎么才能变成0,乘以10呗,至此,我们相加的逻辑完成了

其实分析到这里,我们知道应该用循环了,用什么循环?for是用于次数确定的,while是用于次数不确定的,这里次数你能间接得到吗?不能。所以用while循环,那退出循环条件是什么呢?我们再来思考,在这整个过程中,x在变,x最后为什么?0。不信的话你可以先写true,然后打印输出x,看看结果。当然翻转的数也在变,你用它能做判断条件吗?让它与x相等做判断条件?不要搞笑了。所以,我们只能用x做判断条件,条件是 x!=0

OK,我们上面分析了x在变,那么最后你怎么用新得到的数字与x做比较呢?比不了,怎么办?创建个临时变量存x呗

至此,我们全部分析完,下面来实现它:

public class HuiWen {
    public static void main(String[] args) {
        //定义变量x
        int x = 12321;
        //定义记录余数的变量a,定义翻转后的数num
        int a = 0,num = 0;
        //定义临时变量temp来记录x的值
        int temp = x;
        //进入循环,退出条件为 x != 0
        while (x != 0){
            //不断的对x取余,以此来获取x的每一位
            a = x % 10;
            //不断地对x进行缩小,以此使得取余能够获取x的每一位
            x = x / 10;
            //将最新的数放到已得到数的最右边
            num = num*10 + a;
        }
        //判断翻转后的数是否与x相同,相同为true,不同为false
        System.out.println(num==temp);
    }
}

测试结果:

总结:

  1. 我们一开始分析了目的是要将这个数进行翻转,但是翻转后的数与之前的数是什么关系,我们没有具体分析。翻转后的数的第一位是前面数的最后一位,第二位是前面数的倒数第二位,最后一位是前面数的第一位,这才是翻转的最根本逻辑
  2. 最开始思考对每位取余的时候比较死板。最开始的想法是小学生的数学想法,这种想法在程序中是实现不了的。所以我们更应该抓住最深层次的逻辑
  3. 相加的逻辑最开始就属于是刻板映像了,属于思维惯性了。想解决相加,我们就更应该熟悉翻转的实质
  4. 对于跳出循环的条件,如果不清楚的话,我们可以尝试打印输出嘛,条件就先写true嘛。学会打印输出十分重要。
  5. 还是那几个步骤:分析问题的需求,回忆自己的知识,思考解决的方法。

注意:文中红色标记的属于自己错误的想法,绿色加粗的才是正确的想法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

L纸鸢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值