目录
跟随题目难度,我们来到了第二题,题目如下:
评论区依旧人才辈出,根据测试用例编写程序,代码进需要一行。当然换了测试用例这代码直接就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
。
这里是该段代码的工作方式:
-
while(x/10)
:这个条件会检查x
是否大于或等于 10。如果x
是一个一位数(即 0-9),那么x/10
将为 0(在整数除法中),循环将终止。如果x
是两位数或更多位数,那么x/10
将是非零的,循环将继续。 -
num = num*10 + x%10
:这行代码执行了三个操作:(1)num*10
:将num
乘以 10,以便为下一个数字腾出空间。(2)x%10
:使用取模运算符%
提取x
的个位数字。(3)
将这两个结果相加,并将结果存回num
变量中。 -
x/=10
:这行代码将x
除以 10,从而去掉其个位数字。这样,在下一次循环迭代中,我们就可以处理x
的下一位数字了。
举例来说,如果
x
初始值为 123,并且num
初始化为 0,那么循环会执行三次:
- 第一次迭代:
num = 0*10 + 3 = 3
,x = 123 / 10 = 12
- 第二次迭代:
num = 3*10 + 2 = 32
,x = 12 / 10 = 1
- 第三次迭代:
num = 32*10 + 1 = 321
,x = 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
类型。