思路:根据题目描述,负数肯定不是回文数,0肯定是回文数。
对于正整数:
(1)利用字符串
bool isPalindrome(int x) {
ostringstream stream;
stream<<x;
string num = stream.str();
int j = num.size() - 1;
for(int i = 0; i < num.size();++i){
if (num[i] != num[j])
return false;
--j;
}
return true;
}
代码相对较短,但结果依然不理想。
(2)利用余数
bool isPalindrome(int x) {
//负数肯定不是回文
if (x < 0) return false;
if (x == 0) return true;
int temp_x = x;
int remainder = 0;
vector<int> remainders;
while(x != 0){
remainder = x % 10;
remainders.push_back(remainder);
x = x/ 10;
}
int num_size = pow(10,remainders.size() - 1);
int i = 0;
while(temp_x != 0){
int r = temp_x / num_size;
if (remainders[i] != r) return false;
++i;
temp_x = temp_x % num_size;
num_size /= 10;
}
return true;
}
可以看到,虽然通过的测试用例,但是结果并不好。
缺点:两次取余的计算。向量的额外引用。
优化空间:回文关于中心对称,所以在获得%10的余数之后不必在计算另外一个从做高位取得的余数。只要利用该数组的头和尾逐一比较即可。
收获:
C++ 98 将int类型转换为string类型的用法
#include<sstream>
ostringstream stream;
stream<<num;
string num_ = stream.str();
C++11 可以直接使用to_string()转换为string