文章目录
- 一、题目
- 二、我的解答:逐个判断对应位置的首末数字是否相同
- 三、其他解答
- 3.1 将数字x转为字符串进行处理
- 3.2 反转一半数字进行比较
LeetCode 第9题,回文数;难度等级:简单
一、题目
二、我的解答:逐个判断对应位置的首末数字是否相同
我的第一想法是直接处理数字,逐个判断对应位置的首末数字是否相同。导致代码写的比较复杂,速度也不快。代码如下:
class Solution {
public:bool isPalindrome(int x) {if(x<0)return false;else if(x>=0 && x<10)return true;else{// 先计算 x 的长度 lengthint length=1;while(x/int(pow(10,length))>=10){length++;}length++;//逐个判断对应位置的首末数字是否相同,如 12345 中的 1-5和2-4for(int i=1;i!=length/2+1;i++){int end=(x % int(pow(10,i)))/int(pow(10,i-1));int begin=(x/int(pow(10,length-i)))%10;if(begin!=end)return false;}return true;}}
};
执行结果:
执行用时:20 ms, 在所有 C++ 提交中击败了 17.33% 的用户
内存消耗:6 MB, 在所有 C++ 提交中击败了 11.80% 的用户
三、其他解答
3.1 将数字x转为字符串进行处理
逐个位数比较数字非常麻烦,但处理字符串是很简单的,因为只需要下标操作即可。因此可以将数字x转为字符串进行处理,代码如下(我自己写的,官方代码只有C++):
class Solution {
public:bool isPalindrome(int x) {if(x < 0 || (x % 10 == 0 && x != 0))return false;// 将x转为字符串string str_x=to_string(x);int length=str_x.size();for(int i=0;i!=length/2;i++)if(str_x[i]!=str_x[length-i-1])return false;return true;}
};
执行结果:
执行用时: 4 ms, 在所有 C++ 提交中击败了 95.08% 的用户
内存消耗: 5.8 MB, 在所有 C++ 提交中击败了 33.42% 的用户
知识点:
(1) string s = to_string(i)用于将数字常量转换为字符串,但需要包含头文件 #include<string>
(2) str.size()和str.length()都可以获取字符串长度
3.2 反转一半数字进行比较
如何判断 x = 1234是不是回文数呢?除了依次判断数对 (1,4) 和 (2,3) 是否相等,还有一种直观的方法是先获得 x 的逆序数 x_reverse = 4321,然后通过 if(x == x_reverse) 来判断 x 是否为回文数。但这样容易造成数值上溢,如:
最大整数为 intMax = 2^31^-1 = 2147483647,而 intMax _reverse = 7463847412 > intMax
intMax 反转后就导致了数值上溢,尽管可以使用 long long等数据类型来解决该问题,但这种解决方法显然是不完美的。
实际上,只需要反转一半数字就可以判断回文数。
比如获得 x = 1234 的一半反转数字 x_reverse = 43,然后获得前一半的数字 x_begin = 12,通过if(x_begin == x_reverse) 来判断 x 是否为回文数。但需要特别注意奇数和偶数的情况下,获得的x_begin 是不同的。
代码:
class Solution {
public:bool isPalindrome(int x) {if(x < 0 || (x % 10 == 0 && x != 0))return false;int x_reverse=0;while(x_reverse < x){x_reverse = x_reverse*10+x%10;x/=10;}// 当数字长度为奇数时,我们可以通过 x_reverse/10 去除处于中位的数字。// 例如,当输入为 12321 时,在 while 循环的末尾我们可以得到 x = 12,x_reverse = 123,// 由于处于中位的数字不影响回文(它总是与自己相等),所以我们可以简单地将其去除。return x==x_reverse || x==x_reverse/10;}
};
知识点:
return x==x_reverse || x==x_reverse/10; 这一步非常巧妙