力扣刷题之旅——9.回文数

目录

I 理解题目需求

II 设计程序

一、排除小于0的数

二、判断该数是不是回文数同时翻转这个数

三、判断后输出结果

III 代码解析

一、 int y = x;

二. long num = 0;

三、while判断语句

如何反转后半部分的数字。

四、 表达式 num*10+x == y



跟随题目难度,我们来到了第二题,题目如下:

       评论区依旧人才辈出,根据测试用例编写程序,代码进需要一行。当然换了测试用例这代码直接就G了。


I 理解题目需求

1.设计一个可以分辨回文数的程序

2.输出的结果只需要False或者True

3.使用题目所提供的模版

首先我们来看一下模版给我们提供了什么,我们依旧选择的是C语言

bool isPalindrome(int x) {
    
}

         在编程中,bool 是一种数据类型,用于表示逻辑值:真(true)或假(false)。  点击下面蓝字可以了解到 布尔值的介绍及用法

   这里bool isPalindrome(int x) 是一个函数声明,它表示一个函数 isPalindrome,该函数接受一个整数 x 作为参数,并返回一个布尔值(bool)来表示这个整数是否是回文数。


II 设计程序

既然是一个判断型程序,根据C语言我们可以得知用于判断结构有(来源 菜鸟教程):

语句描述
if 语句一个 if 语句 由一个布尔表达式后跟一个或多个语句组成。
if...else 语句一个 if 语句 后可跟一个可选的 else 语句,else 语句在布尔表达式为假时执行。
嵌套 if 语句您可以在一个 if 或 else if 语句内使用另一个 if 或 else if 语句。
switch 语句一个 switch 语句允许测试一个变量等于多个值时的情况。
嵌套 switch 语句您可以在一个 switch 语句内使用另一个 switch 语句。

        所以我们可以首先选择If语句来进行判断,来帮我们排除负数,因为负数存在符号不可能实现回文。

一、排除小于0的数

 if(x<0)
        return false;

          直接用if判断,让小于0的数使程序输出为false。

二、判断该数是不是回文数同时翻转这个数

while(x/10){
        num = num*10 +x%10;
        x/=10;
    }

         检查该数是否大于10,小于10而又大于等于0的整数都是回文数,可以直接输出为true

三、判断后输出结果

return num*10+x == y; 

参考代码:来源 香芋味的猫 

bool isPalindrome(int x){
    if(x<0)
        return false;
    int y = x;
    long num = 0;
    while(x/10){
        num = num*10 +x%10;
        x/=10;
    }
    return num*10+x == y; 
}


III 代码解析

一、 int y = x;

        这行代码将一个名为x的整数(我们假设它已经被定义并赋值)的值赋给了另一个名为y的整数变量。

二. long num = 0;

        这行代码定义了一个名为num的长整型(long)变量,并初始化为0。long是C/C++/Java等编程语言中的一种数据类型,用于存储比int更大的整数值。在大多数现代系统上,int通常是32位的,而long通常是64位的(但这取决于具体的编译器和平台)。

三、while判断语句

while(x/10){
        num = num*10 +x%10;
        x/=10;

        在这段代码中,while(x/10) 是一个循环条件,用于迭代一个整数 x 的每一位数字,并从低位到高位(即从右到左)构建一个新的整数 num

这里是该段代码的工作方式:

  1. while(x/10):这个条件会检查 x 是否大于或等于 10。如果 x 是一个一位数(即 0-9),那么 x/10 将为 0(在整数除法中),循环将终止。如果 x 是两位数或更多位数,那么 x/10 将是非零的,循环将继续。

  2. num = num*10 + x%10:这行代码执行了三个操作:

    (1)num*10:将 num 乘以 10,以便为下一个数字腾出空间。

    (2)x%10:使用取模运算符 % 提取 x 的个位数字。
    (3)将这两个结果相加,并将结果存回 num 变量中。

  3. x/=10:这行代码将 x 除以 10,从而去掉其个位数字。这样,在下一次循环迭代中,我们就可以处理 x 的下一位数字了。

举例来说,如果 x 初始值为 123,并且 num 初始化为 0,那么循环会执行三次:

  1. 第一次迭代:num = 0*10 + 3 = 3x = 123 / 10 = 12
  2. 第二次迭代:num = 3*10 + 2 = 32x = 12 / 10 = 1
  3. 第三次迭代:num = 32*10 + 1 = 321x = 1 / 10 = 0(在整数除法中,结果为 0)

循环结束后,num 将包含原始数字 x 的反转版本(在这个例子中是 321)。

这种技术经常用于数字反转、检查回文数等算法中。

那么为什么会用到这个呢,我们可以对比官方的解释来看一下,这里直接引用。

如何反转后半部分的数字。

        对于数字 1221,如果执行 1221 % 10,我们将得到最后一位数字 1,要得到倒数第二位数字,我们可以先通过除以 10 把最后一位数字从 1221 中移除,1221 / 10 = 122,再求出上一步结果除以 10 的余数,122 % 10 = 2,就可以得到倒数第二位数字。如果我们把最后一位数字乘以 10,再加上倒数第二位数字,1 * 10 + 2 = 12,就得到了我们想要的反转后的数字。如果继续这个过程,我们将得到更多位数的反转数字。

        现在的问题是,我们如何知道反转数字的位数已经达到原始数字位数的一半?

由于整个过程我们不断将原始数字除以 10,然后给反转后的数字乘上 10,所以,当原始数字小于或等于反转后的数字时,就意味着我们已经处理了一半位数的数字了。

作者:力扣官方题解
链接:https://leetcode.cn/problems/palindrome-number/solutions/281686/hui-wen-shu-by-leetcode-solution/
来源:力扣(LeetCode)

四、 表达式 num*10+x == y

         这里,如果 num*10+x 等于 y,则返回 true(即 1),否则返回 false(即 0)。在 C 语言中,当 bool 类型用于 if 语句或其他需要布尔值的上下文中时,这个 int 类型的值会自动转换为 bool 类型。

  • 16
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值