编号回文代码不起作用

时间:2016-10-09 14:54:58

标签: java palindrome

我正在通过Project Euler工作,而对于问题4,我的回文代码并没有工作。具体来说,它返回998001(999 * 999),好像它是回文。

检查回文的代码有效,但它保持循环并替换最大值,尽管它不是回文。我错过了什么?

感谢您的帮助

public int palindromeNumber()
{
    int max=0;
    for(int x = 100; x<1000; x++)
    {
        for(int y = 100; y<1000; y++)
        {
            int z = x*y;
            StringBuilder num = new StringBuilder(Integer.toString(z));
            StringBuilder rev = num.reverse();
            if(num==rev)
            {
                max=z;
            }
        }
    }
    return max;
}

3 个答案:

答案 0 :(得分:5)

如果您查看StringBuilder.reverse()方法,它会返回对同一对象的引用(在您的情况下为num)

@Override
public StringBuilder reverse() {
    super.reverse();
    return this;
}

所以你的rev == num总是如此,你得到999 * 999,因为它是一个循环的结束

答案 1 :(得分:4)

您的代码是正确的,但正如评论所指出的那样,您正在比较地址而不是字符串。

String是一个对象,而不是一个原始类型,因此当你比较原始和反向时,'=='将不起作用。

相反,您需要使用.equals(String)方法。

这是一个单行证明的概念:

max = (num.equals(new StringBuilder(Integer.toString(z)).reverse())) ? z : max;

注意:

出于性能原因,您可能希望尝试以数字方式实现此功能,转换和解析需要时间。

概念的快速证明:

 num = origNum
 while (num > 0)
 {
      digit = num % 10;
      rev = rev * 10 + digit;
      num = num / 10;
 }

 if (origNum == rev) //max..

答案 2 :(得分:0)

Please make some changes as - 

public static int palindromeNumber()
{
    int max=0;
    for(int x = 100; x<1000; x++)
    {
        for(int y = 100; y<1000; y++)
        {
            int z = x*y;
            StringBuilder num = new StringBuilder(Integer.toString(z));
            StringBuilder numberCopy = new StringBuilder(num);
            StringBuilder rev = num.reverse();

            if(numberCopy.toString().equals(rev.toString()))
            {
                max=z;
            }
        }
    }
    return max;
}

代码中的问题是,当你使用rev = num.reverse(); 然后每次循环它用相反的数字修改相同的object-num,然后将其分配给rev。现在两个参考号和&amp; rev指向同一个修改过的对象。(上次迭代中num和rev值为999)

然后你使用==哪个检查引用指向同一个对象,这里num和rev指向同一个对象,所以每次条件都为真。

解决方案 -

  1. 在修改之前将对象复制到另一个对象,以后可以用于比较。

  2. 使用等于比较值==。