使用1位变量确定数字是否是数字回文

时间:2013-11-02 18:32:24

标签: algorithm bit-manipulation

我在一个显示Google采访问题的网站上看到了这个问题。

我不知道如何解决这个问题。

如果我们被允许保留一些其他变量,那么我建议保留2个指数,1点指向开头,1点指向结尾。然后使用bit变量来比较它们中的2个(通过位操作)。

但是如果我们不允许再使用任何变量,我就不知道如何解决它。

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;
    }
    

    如果需要,上述内容也可以插入单个声明中。

    如果我们允许修改实际数字,也可以检查第一位和最后一位,如上所述,但是然后修改数字以去掉第一位和最后一位,这样我们就可以检查第一个和最后一个比特,直到数字为零。

Live demo

注意上面没有一个使用位变量。也许比特变量只是一个标志,用于跟踪数字是否是回文。