要点:C#类型转化、取整取余、while循环
题目描述
给定一个整数 x ,如果 x 是一个回文整数,返回 true;否则,返回 false。
回文数是指正序(从左到右)和倒序(从右到左)读都是一样的整数。例如,121是回文数,而123不是。
示例:
示例1:输入:x = 121 输出:true
示例2:输入:x = -121 输出:false
示例3:输入:x = 10 输出:false
解法:
1. 使用字符串解决:
将int类型的数字转化为string类型的字符串,将通过for循环遍历判断字符串的前后是否一致。
public class Solution {
public bool IsPalindrome(int x) {
string s = x.ToString(); //将数字转化为字符串
//因为回文数字从前往后以及从后往前都是一样的数字,因此可以以字符串的中心为分界点,只需遍历到字符串一半的位置即可
for(int i = 0; i < s.Length / 2; i++){
if(s[i] != s[s.Length-i-1]){ //比较前后的字符
return false;
}
}
return true;
}
}
注意: C#中string类型的属性与方法需要规范书写,首字母需要大写。string类型具体的属性与方法详见:C# 字符串(String) | 菜鸟教程
2. 数学解法:
应用取整与取余获取回文数不同数位的数字进行比较。
以12321为例,12321 / 10000 = 12321 %10 = 1
(12321 % 10000)/ 1000 = 12321 % 100 / 10 = 2
以此类推。
实际代码操作步骤如下:
1、在进行上述操作之前,我们需要知道所给数字的位数,这样才能知道最高位的数字是多少。方法是判断所给数字是不是10以及10以内的数字,如果不是则增加位数,继续去除,直到除完得到的数字是10以内数字为止,这样就能得到所给数字的最高位数:
public class Solution {
int temp = x;
int help = 1;
while(temp >= 10){
help = help * 10; //判断数字的位数
temp = temp / 10;
}
}
2、得到数字的位数后,我们可以进行比较,首先比较数字的头尾,头尾不一致的情况下,直接返回false。
public class Solution {
int temp = x;
int help = 1;
while(temp >= 10){
help = help * 10; //判断数字的位数
temp = temp / 10;
}
if(x % 10 !=x / help){ //判断头尾是否一致
return false;
}
3、头尾一致的情况下,去掉首尾的数字,以便比较第二高位数以及第二低位数的数字,首尾数字去掉的方法依照12321的例子进行:
public class Solution {
int temp = x;
int help = 1;
while(temp >= 10){
help = help * 10; //判断数字的位数
temp = temp / 10;
}
if(x % 10 !=x / help){ //判断头尾是否一致
return false;
x = x % help /10; //去掉首尾
}
4、由于首尾已经去掉了,因此现在剩下n-2位数字,继续判断去掉首尾后的数字是不是回文数,只需要重复2、3操作,唯一的变化是数字的最大数位发生了变化,因此我们只需要改变他的最大数位即可。
以“12321”为例,首尾的“1”去掉了,变成了数字“232”,因此我们可以仍然按照2、3的操作去判断,只不过取整的操作从10000变成了100。因此只要中间的数不为0,这个循环就可以无限重复下去。
最终的代码解答如图所示:
public class Solution {
public bool IsPalindrome(int x) {
if(x < 0){
return false;
}
int help = 1;
int temp = x;
while(temp >= 10){
help = help * 10; //判断数字的位数
temp = temp / 10;
}
while(x != 0){
if(x % 10 !=x / help){ //判断头尾是否一致
return false;
}
x = x % help /10; //去掉数字的首尾
help = help / 100; //减少数字位数继续判断
}
return true;
}
}
注意:从示例中可以看到,数字-121不是回文数字,在字符串比较的情况下永远不会判定成true,但在数字解法下需要自己规定小于0的数字都不是回文数,返回false。