我一直在研究Project Euler问题4.我是java的新手,并且相信我找到了答案(906609 = 993*913,使用Excel!).
当我打印出注释掉的那一行时,我可以说我的字符串操作有效.我已经研究了一些比较字符串的方法,以防我没有多少东西,但这个例程并没有给我一个结果.
请帮我确定一下为什么不打印答案?
詹姆士
public class pall{
public static void main(String[] args){
int i;
int j;
long k;
String stringProd;
for(i=994;i>992; i--){
for (j=914;j>912; j--){
k=(i*j);
stringProd=String.valueOf(k);
int len=stringProd.length();
char[] forwards=new char[len];
char[] back = new char[len];
for(int l=0; l<len; l++){
forwards[l]=stringProd.charAt(l);
}
for(int m=0; m<len;m++){
back[m]=forwards[len-1-m];
}
//System.out.println(forwards);
//System.out.println(back);
if(forwards.toString().equals(back.toString())){
System.out.println(k);}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您正在比较数组的字符串表示形式.toString()没有给你你的想法.例如,下面的代码清楚地表明:
char[] arr1 = {'a', 'b'};
char[] arr2 = {'a', 'b'};
System.out.println(arr1.toString() + " : " + arr2.toString());
Run Code Online (Sandbox Code Playgroud)
此代码打印:
[C@16f0472 : [C@18d107f
Run Code Online (Sandbox Code Playgroud)
因此,即使内容相等,两个数组的字符串表示也是不同的.这是因为数组不会覆盖toString()方法.它继承了该Object#toString()方法.
toString类的方法Object返回一个字符串,该字符串由对象为实例的类的名称,at符号字符@和对象的哈希码的无符号十六进制表示组成.换句话说,此方法返回一个等于值的字符串:Run Code Online (Sandbox Code Playgroud)getClass().getName() + '@' + Integer.toHexString(hashCode())
因此,在上面的输出中,[C是输出char[].class.getName(),并且18d107f是哈希码.
您也不能比较使用的数组forward.equals(back),因为Java中的数组不会覆盖equals()或者hashCode()两者之一.任何选择?是的,为了比较数组,您可以使用Arrays#equals(char[], char[])方法:
if (Arrays.equals(forward, back)) {
System.out.println(k);
}
Run Code Online (Sandbox Code Playgroud)
另外,要获得char数组,您不需要这些循环.你可以使用String#toCharArray()方法.而且为了得到String的反转,你可以将字符串包装在一个StringBuilder实例中,并使用它的reverse()方法:
char[] forwards = stringProd.toCharArray();
char[] back = new StringBuilder(stringPod).reverse().toString().toCharArray();
Run Code Online (Sandbox Code Playgroud)
现在您已经找到了一种简单的方法来反转字符串,那么如何String#equals()直接使用方法,并且无法创建这些字符数组呢?
String stringPod = String.valueOf(k);
String reverseStringPod = new StringBuilder(stringPod).reverse().toString()
if (stringPod.equals(reverseStringPod)) {
System.out.println(k);
}
Run Code Online (Sandbox Code Playgroud)
最后,因为它是关于项目的欧拉,这是关于速度和大多数数学.您应该考虑避免使用String实用程序,并使用常规除法和模数运算来获取每个数字,从开始和结束,并比较它们.
| 归档时间: |
|
| 查看次数: |
1038 次 |
| 最近记录: |