如何检查整数的二进制表示是否为回文?
希望是正确的:
_Bool is_palindrome(unsigned n)
{
unsigned m = 0;
for(unsigned tmp = n; tmp; tmp >>= 1)
m = (m << 1) | (tmp & 1);
return m == n;
}
由于您没有指定要使用哪种语言,这里提供一些C代码(虽然不是最有效的实现方式,但它可以说明问题):
/* flip n */
unsigned int flip(unsigned int n)
{
int i, newInt = 0;
for (i=0; i<WORDSIZE; ++i)
{
newInt += (n & 0x0001);
newInt <<= 1;
n >>= 1;
}
return newInt;
}
bool isPalindrome(int n)
{
int flipped = flip(n);
/* shift to remove trailing zeroes */
while (!(flipped & 0x0001))
flipped >>= 1;
return n == flipped;
}
编辑已经针对你的10001个问题进行修复。
创建一个包含字符及其位反转字符的256行图表。给定一个4字节整数,取第一个字符,在图表中查找并将答案与整数的最后一个字符进行比较。如果它们不同,则不是回文;如果它们相同,则重复操作中间字符。如果它们不同,则不是回文;否则就是回文。
这里有很多好的解决方案。让我添加一个我认为非常易读,虽然不是最有效的:
/* Reverses the digits of num assuming the given base. */
uint64_t
reverse_base(uint64_t num, uint8_t base)
{
uint64_t rev = num % base;
for (; num /= base; rev = rev * base + num % base);
return rev;
}
/* Tells whether num is palindrome in the given base. */
bool
is_palindrome_base(uint64_t num, uint8_t base)
{
/* A palindrome is equal to its reverse. */
return num == reverse_base(num, base);
}
/* Tells whether num is a binary palindrome. */
bool
is_palindrome_bin(uint64_t num)
{
/* A binary palindrome is a palindrome in base 2. */
return is_palindrome_base(num, 2);
}
以下内容适用于任何无符号类型。(有符号类型的位运算往往会带来问题。)
bool test_pal(unsigned n)
{
unsigned t = 0;
for(unsigned bit = 1; bit && bit <= n; bit <<= 1)
t = (t << 1) | !!(n & bit);
return t == n;
}
int palidrome (int num)
{
int rev = 0;
num = number;
while (num != 0)
{
rev = (rev << 1) | (num & 1); num >> 1;
}
if (rev = number) return 1; else return 0;
}
我知道这个问题已经发布了2年,但是我有一个更好的解决方案,它不依赖于单词大小和其他因素。
int temp = 0;
int i = num;
while (1)
{ // let's say num is the number which has to be checked
if (i & 0x1)
{
temp = temp + 1;
}
i = i >> 1;
if (i) {
temp = temp << 1;
}
else
{
break;
}
}
return temp == num;
Javascript 解决方案
function isPalindrome(num) {
const binaryNum = num.toString(2);
console.log(binaryNum)
for(let i=0, j=binaryNum.length-1; i<=j; i++, j--) {
if(binaryNum[i]!==binaryNum[j]) return false;
}
return true;
}
console.log(isPalindrome(0))
int number = 245;
String test = Integer.toString(number, 2);
if(isPalindrome(test)){
...
}
我认为最好的方法是从两端开始,向内逐步比较,即比较第一位和最后一位、第二位和倒数第二位等等,这将具有O(N/2)的时间复杂度,其中N是整数的大小。如果在任何时候你的对应位不相同,那么它就不是回文。
bool IsPalindrome(int n) {
bool palindrome = true;
size_t len = sizeof(n) * 8;
for (int i = 0; i < len / 2; i++) {
bool left_bit = !!(n & (1 << len - i - 1));
bool right_bit = !!(n & (1 << i));
if (left_bit != right_bit) {
palindrome = false;
break;
}
}
return palindrome;
}