Я попытался решить этот вопрос, изменив число, используя побитовые операции: - скажем, например, если числовое двоичное представление - 00000110, то, что делает этот код, отправьте 0000011 в код, а затем влево shift reverse_num 5 раз, чтобы получить 01100000, что очевидно наоборот, эта программа выполняет "&" этого номера с исходным номером. Если ответ равен 1, тогда число называется палиндромом, возвращается false false. Есть ли какой-то недостаток в логике? Если есть, я думаю, что это в & part.
class Solution {
public:
bool isPalindrome(int x) {
if(x<0)
return false;
int num=x;
int reverse_num=x;
int count=sizeof(x);
num >>= 1;
while(num)
{
reverse_num <<= 1;
reverse_num |= num & 1;
num >>= 1;
count--;
}
reverse_num <<= count;
if(!(reverse_num&x))
return true;
else return false;
}
};
Я все еще хочу знать, что не так с предыдущим кодом. Извините за такой глупый вопрос. Я программирую в noob. Оригинальный вопрос: https://oj.leetcode.com/problems/palindrome-number/
Хотя мне удалось обойти этот вопрос, сделав это:
class Solution {
public:
bool isPalindrome(int x) {
long long y=0;
long long t=x;
long long p;
p=x;
while(t){
y=y*10+t%10;
t=t/10;
}
if(p==y && p>=0)
return true;
else return false;
}
};
Для окончательного оператора if && является логическим и. В C/C++ (и многих других языках) логический тест для целого числа возвращает true, если значение равно 0.
Таким образом, ваша функция вернет true только в том случае, если x или reverse_num равно 0
10001
это палиндром, а в десятичном17
нет.reverse_num & x
будет истинным, если у них есть общие биты, а не все биты. Используйтеreverse_num == x
чтобы увидеть, совпадают ли они.