最新采购求购信息网站,把公司网站 公开下载 做教程 侵权吗,安溪住房和城乡建设网站,个人养老保险查询前往题目有 反转一半数字
思路
映入脑海的第一个想法是将数字转换为字符串#xff0c;并检查字符串是否为回文。但是#xff0c;这需要额外的非常量空间来创建问题描述中所不允许的字符串。
第二个想法是将数字本身反转#xff0c;然后将反转后的数字与原始数字进行比较并检查字符串是否为回文。但是这需要额外的非常量空间来创建问题描述中所不允许的字符串。
第二个想法是将数字本身反转然后将反转后的数字与原始数字进行比较如果它们是相同的那么这个数字就是回文。 但是如果反转后的数字大于 int.MAX我们将遇到整数溢出问题。
按照第二个想法为了避免数字反转可能导致的溢出问题为什么不考虑只反转 int\text{int}int 数字的一半毕竟如果该数字是回文其后半部分反转后应该与原始数字的前半部分相同。
例如输入 1221我们可以将数字 “1221” 的后半部分从 “21” 反转为 “12”并将其与前半部分 “12” 进行比较因为二者相同我们得知数字 1221 是回文。 算法代码与分析
class Solution {
public:bool isPalindrome(int x) {// 特殊情况// 如上所述当 x 0 时x 不是回文数。// 同样地如果数字的最后一位是 0为了使该数字为回文// 则其第一位数字也应该是 0// 只有 0 满足这一属性if (x 0 || (x % 10 0 x ! 0)) {return false;}int revertedNumber 0;while (x revertedNumber) {revertedNumber revertedNumber * 10 x % 10;x / 10;}// 当数字长度为奇数时我们可以通过 revertedNumber/10 去除处于中位的数字。// 例如当输入为 12321 时在 while 循环的末尾我们可以得到 x 12revertedNumber 123// 由于处于中位的数字不影响回文它总是与自己相等所以我们可以简单地将其去除。return x revertedNumber || x revertedNumber / 10;}
}; 复杂度分析
时间复杂度O(logn)对于每次迭代我们会将输入除以 10 空间复杂度O(1)。我们只需要常数空间存放若干变量。