我正在尝试解决以下问题:
找出由两个3位数字的乘积制成的最大回文。
我有以下Java代码:
public static void main(String[] args) {
int a = 999, b = 999;
for(int i = 100; i <= a; i++) {
for(int j = 100; j <= b; j++) {
checkPalindrome(i*j, i, j);
}
}
}
public static void checkPalindrome(int n, int a, int b) {
String s = "" + n;
boolean palindrome = false;
int j = s.length()-1;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) != s.charAt(j))
break;
j -= i;
}
if(palindrome)
System.out.println(n + ", " + a + ", " + b);
}
我仍然缺少“回文”变量的变化但是目前如果我运行它我在第28行得到一个String index out of range
j -= i
我只是不明白为什么这种情况正在发生我的意思是,我得到的差异是导致数字低于0,但我无法弄清楚为什么会发生这种情况。有人可以解释一下吗?
答案 0 :(得分:1)
将您的代码更改为:
public static void checkPalindrome(int n, int a, int b) {
String s = "" + n;
boolean palindrome = true;
int j = s.length()-1;
for(int i = 0; i < s.length(); i++){
if(s.charAt(i) != s.charAt(j))
palindrome = false;
}
if(palindrome)
System.out.println(n + ", " + a + ", " + b);
}
答案 1 :(得分:1)
我认为您希望j--
不是j -= i
。特别是因为i
从0开始。
答案 2 :(得分:1)
您的方法可以像这样改进。 for循环i&lt; = j中的条件也减少了迭代次数。
public static void checkPalindrome(int n, int a, int b) {
String s = "" + n;
boolean palindrome = false;
int j = s.length()-1;
for(int i = 0; i <= j; i++){
if(s.charAt(i) != s.charAt(j))
break;
j --;
}
if(palindrome)
System.out.println(n + ", " + a + ", " + b);
}
希望这有帮助。
答案 3 :(得分:0)
你正在递增我 - 你想减少j - 你不想做j - = i。
否则,对于长度为5的字符串,您将获得:
i = 0,j = 4
i = 1,j = 4
i = 2,j = 3
i = 3,j = 1
i = 4,j = -2
虽然如果它给出索引超出范围的消息,那么你正在运行不同版本的代码 - j - =我不可能生成它。