验证回文数字

博客围绕判断整数是否为回文数展开,提出两种解题思路。一是将整数各位存于数组,通过镜像对称判断;二是构建反向整数,对比反向整数与原数来判断。还给出了时间复杂度,且未将整数转换为字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:
Determine whether an integer is a palindrome. An integer is a
palindrome when it reads the same backward as forward.

Follow up:

Coud you solve it without converting the integer to a string?

解题思路:
方法一:
step1:若该整数为负,则必不是回文数字
step2:若该整数位0,则必为回文数字
step3:在该整数为正数的情况下,将每一位数字按顺序存储在数组里,若为回文,则必满足镜像对称.
时间复杂度为O(n)(n为x的位数)
代码如下:

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0) return false;
        if(x==0)    return true;
        int[] p = new int[];
        int i=0;
        while(x!=0){
            p[i++]=x%10;
            x/=10;
        }
        for(int j=0;j<(i+1)/2;j++){
            if(p[j]!=p[i-j-1])  return false;
        }
        return true;
    }
}

方法二:
借助一个反向整数来验证。
step1:如果该整数为负或非零但末位为零,则必不是回文数字。
step2:从低位到高位构建该整数的反向整数,直到反向整数的位数为原数字的一半(偶数位)或一半+1(基数位),同时舍弃x的低位。若x与反向数组相等,则为回文数字。
代码如下:

class Solution {
    public boolean isPalindrome(int x) {
        if(x<0||(x%10==0&&x!=0))    return false;
        int rev = 0;
        while(x>rev){
            rev=rev*10+x%10;
            x/=10;
        }
        return x==rev||x==rev/10;
    }
}
### PTA 验证回文算法实现 PTA 中验证回文串的任务通常涉及判断给定字符串是否为回文结构。以下是基于 C++ 的一种高效实现方式,其核心逻辑来源于双指针方法[^3]。 #### 算法描述 1. 使用两个指针 `left` 和 `right` 分别指向字符串的起始和结尾。 2. 跳过所有非字母数字字符,直到找到有效的比较对象。 3. 对于有效字符,将其统一转为小写后进行对比。 4. 如果发现任意一对字符不匹配,则立即返回 `false`;如果全部匹配成功,则最终返回 `true`。 #### 代码实现 以下是一个完整的 C++ 版本实现: ```cpp #include <iostream> #include <cctype> // 提供 isalnum 和 tolower 函数 using namespace std; bool isPalindrome(const string& s) { int left = 0; int right = s.size() - 1; while (left < right) { // 左侧跳过非字母数字字符 while (left < right && !isalnum(s[left])) { left++; } // 右侧跳过非字母数字字符 while (left < right && !isalnum(s[right])) { right--; } // 比较当前左右两侧的有效字符 if (tolower(s[left]) != tolower(s[right])) { return false; // 若不同则不是回文 } // 移动指针继续检查下一组字符 left++; right--; } return true; // 所有对应字符均相同则是回文 } int main() { string input; getline(cin, input); // 获取一行输入数据 if (isPalindrome(input)) { cout << "Yes" << endl; } else { cout << "No" << endl; } return 0; } ``` 此程序能够处理各种边界情况,例如空字符串、仅含特殊符号的情况以及大小写字母混合的情形[^3]。 #### 测试案例解析 - **测试用例 1**: 输入 `"level"`,输出 `"Yes"`。解释:该字符串正向逆向一致,因此是回文串[^5]。 - **测试用例 2**: 输入 `"1 + 2 = 2 + 1 ="`,输出 `"No"`。解释:去除无关字符后得到序列 `12=21=`,显然前后不对称[^5]。 --- ### Python 实现补充 对于熟悉 Python 的开发者来说,也可以采用更简洁的方式完成同样功能: ```python def is_palindrome(s: str) -> bool: filtered_chars = [char.lower() for char in s if char.isalnum()] return filtered_chars == filtered_chars[::-1] # 主函数调用部分 if __name__ == "__main__": test_str = input().strip() print("Yes" if is_palindrome(test_str) else "No") ``` 上述脚本通过列表推导式快速过滤掉非法字符构建新的纯字母数字序列,最后利用切片技术轻松判定两者关系[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值