我在一个显示Google采访问题的网站上看到了这个问题。
我不知道如何解决这个问题。
如果我们被允许保留一些其他变量,那么我建议保留2个指数,1点指向开头,1点指向结尾。然后使用bit变量来比较它们中的2个(通过位操作)。
但是如果我们不允许再使用任何变量,我就不知道如何解决它。
答案 0 :(得分:1)
对于2n位的数字作为回文,位置i的每个位必须等于索引处的位(2n-i)。 使用异或(XOR)单个位可以轻松进行比较: 当且仅当位a和b不相等时,XOR b == 1。 因此,当用这种方式比较每个相应的位对(见上文)并通过对所有单位比较结果进行OR运算来构建结果时,对于回文而言,它将为0,对于任何其他数字,它将为1。
答案 1 :(得分:1)
我假设我们正在谈论逐位回文(即3 = 11,但2 = 10不是)。
我看到有两种可能性:
(我为每个编写了一些Java代码。仅为了便于阅读而包含一些括号)
指数不计入变量。
我要说的第一件事可能是“但指数是变量......”。
我们可以循环查看数字,并在得到不匹配后返回。
下面的 digits
是一个变量,但为了便于阅读 - 它可以简单地替换为if语句。
digits
的公式出现在一些游戏之后(可能有一种更简单的方法)。
boolean isPalidrome(int number)
{
int digits = (int)Math.ceil(Math.ceil(Math.log10(1+number)/Math.log10(2)))-1;
for (int i = 0; number/2 >> i != 0; i++)
{
if (((number >> i) & 1) != (((number >> digits - i) & 1)))
return false;
}
return true;
}
指数确实算作变量。
这可以通过基本上展开上面的循环来完成,假设我们给出了一个固定大小的数字(例如int
,即32位)。
我将类型更改为byte
,因为我没有真正看到基本上重复那么多行的观点。 byte
只有8位,所以我们只需要4次检查,并且有中断条件。
再次digits
是一个变量,但不一定是。
boolean isPalidrome(byte number)
{
int digits = (int)Math.ceil(Math.ceil(Math.log10(1+number)/Math.log10(2)))-1;
if ((number & 1) != (((number >> digits) & 1)))
return false;
if ((number/2 >> 1) == 0)
return true;
if (((number >> 1) & 1) != (((number >> (digits - 1)) & 1)))
return false;
if ((number/2 >> 2) == 0)
return true;
if (((number >> 2) & 1) != (((number >> (digits - 2)) & 1)))
return false;
if ((number/2 >> 3) == 0)
return true;
if (((number >> 3) & 1) != (((number >> (digits - 3)) & 1)))
return false;
return true;
}
如果需要,上述内容也可以插入单个声明中。
如果我们允许修改实际数字,也可以检查第一位和最后一位,如上所述,但是然后修改数字以去掉第一位和最后一位,这样我们就可以检查第一个和最后一个比特,直到数字为零。
注意上面没有一个使用位变量。也许比特变量只是一个标志,用于跟踪数字是否是回文。