我必须在整数域中这样做,不能使用字符串。
我采用以下方法:
bool isPalindrome(int x) {
//Fails for 1000021
if(x < 0)
return false;
int count = 0, temp = x;
while(temp/=10) count++;
unsigned long long exp = pow(10, count);
//std::cout<<exp<<"\n";
while(x > 0 ){
int front = x / exp;
int back = x % 10;
if(front!=back)
return false;
//std::cout<<"x : "<<x<<"\n";
x %= exp;
exp /= 100;
//std::cout<<"x : "<<x<<"\n";
x /= 10;
//std::cout<<"x : "<<x<<"\n";
}
return true;
}
我将成对的前尾数字相匹配,同时从前和后砍掉整数。它失败了1000021。在第二次迭代中,x最终为0,因此返回true。
是否可以使用当前方法处理这种情况?
EDIT1:稍微修复了代码。每次迭代exp / = 100,因为每次迭代都没有两位数。
EDIT2:固定代码。 x%= exp; ,之前是x / = exp;基本上是删除了第一个数字右边的所有内容,这不是我想要的。
答案 0 :(得分:4)
另一种方法:将每个数字加到int向量上,然后复制该向量并将其反转(如果向量相等,则数字为“回文”)。
bool isPalindrome(int x)
{
std::vector<int> v;
while(x > 0)
{
int r = x % 10;
v.push_back(r);
x -= r;
x /= 10;
}
std::vector<int> c(v);
std::reverse(c.begin(), c.end());
return (c==v);
}
答案 1 :(得分:2)
unsigned decReversed(unsigned x) {
unsigned r = 0;
while (x) {
r = r * 10 + x % 10;
x /= 10;
}
return r;
}
bool isDecPalindrome(unsigned x)
{
return x == decReversed(x);
}
答案 2 :(得分:0)
这似乎是一个leetcode问题。计算倒数是解决此问题的最有效方法。以下是使用Catch2
的解决方案,简单分析和测试#define CATCH_CONFIG_MAIN
#include "catch2/catch.hpp"
/**
* Problem: https://leetcode.com/problems/palindrome-number
*
* Runtime: O(K), where K is the number of digits
* Memory: O(1)
*/
class Solution {
public:
bool isPalindrome(int x) {
constexpr int TEN = 10;
if (x < 0) return false;
long tmp = x;
long reversed_number = 0; // Cast to long to avoid overflow.
while (tmp > 0) {
reversed_number = reversed_number * TEN + (tmp % TEN);
tmp /= TEN;
}
return reversed_number == x;
}
};
TEST_CASE("Basic tests") {
Solution sol;
SECTION("Case 1") { CHECK(!sol.isPalindrome(123)); }
SECTION("Case 2") { CHECK(!sol.isPalindrome(-121)); }
SECTION("Case 3") { CHECK(!sol.isPalindrome(2147483647)); }
SECTION("Case 4") { CHECK(sol.isPalindrome(0)); }
SECTION("Case 5") { CHECK(sol.isPalindrome(121)); }
SECTION("Case 6") { CHECK(sol.isPalindrome(33)); }
}