目录
一、题目描述
二、初次解答
1. 思路:将指定int型数字转换为字符串类型,判定字符串的头尾元素是否相同。若全部相同,则返回true;一旦有元素不同,则返回false。
2. 代码:
bool isPalindrome(int x) { /* 前提考虑:负数肯定不是 */ if (x < 0) return false; /* 将数值转换为字符串 */ char real[11]; sprintf(real, "%d", x); /* 判断头尾是否相等 */ int str_len = strlen(real); int i = 0, j = str_len -1; while(i < j) { if (real[i++] != real[j--]) return false; } return true; }
3. 优点:容易想到!
4. 缺点:①需要11字节的额外空间来保存转换后的字符串。②最坏情况的时间复杂度为O(n)。
三、优解
1. 思路:反转x的后半部分,若x为回文数则后半部分与前半部分相等。
2. 代码:
bool isPalindrome(int x) { /* 临界情况:负数及0结尾的数字 */ if (x < 0 || (x % 10 == 0 && x != 0)) return false; /* 反转数字后半部分 */ int revertedNumber = 0; while (x > revertedNumber) { revertedNumber = revertedNumber * 10 + x % 10; x /= 10; } /* 考虑x位数为偶数、奇数情形 */ return x == revertedNumber || x == revertedNumber / 10; }
3. 优点:①仅需要4字节的额外空间。②执行速度更快。
4. 缺点:难想到。
四、总结
当需要判定一个数字是否是回文数时,可以仅反转后半部分内容,与前半部分比较。