我正在尝试编写一个方法,该方法将整数队列作为参数,并检查队列是否为回文。
我的方法似乎适用于大多数队列但不适用于其他队列?我无法确定那些与之无关的特征......
这是我的代码:
public static boolean isPalindrome(Queue<Integer> q) {
boolean result = false;
Stack<Integer> save = new Stack<Integer>();
if(q.isEmpty()){
result = true;
}
for(int i = 0; i < q.size(); i++){
int n = q.remove();
save.push(n);
q.add(n);
}
for(int j = 0; j < q.size(); j++){
int a = q.remove();
int b = save.pop();
if(a == b){
result = true;
}
q.add(a);
}
return result;
}
答案 0 :(得分:0)
似乎除了第二个for循环外,一切都是正确的。您需要更改以检查堆栈和队列的内容是否不同。如果是,则返回false
。在方法结束时,返回true
。
for (int j = 0; j < q.size(); j++) {
int a = q.remove();
int b = save.pop();
if (a != b) {
return false;
}
q.add(a);
}
return true;
答案 1 :(得分:0)
考虑输入队列:[1,1,2]
该方法创建的堆栈save
将为[2,1,1]
在第二个for
循环中,对于j=1
,然后a == b == 1
,该方法错误地声称回文。通常,如果队列和堆栈在其各自的索引处具有相同的值,则该方法将失败。 (例如输入[4,2,2,5])
存在多个问题,但主要的问题是,一旦该方法声称回文,则断言是固定的。正如评论中所提到的,最好假设输入不是回文,然后证明它。
答案 2 :(得分:0)
在你的第二个for循环中,你有
if(a == b){
result = true;
}
然而,在循环的其余部分中,它不会再次变为假。这意味着,给定长度为n的队列,如果第i个元素和第(n-i)个元素相同,则结果为真。例如,{1,3,5,1}的队列将返回true。
更好的实施方式对于如何使用笔和纸进行检查更加直观。 你只需要检查每个第i个和第(n-i)个元素,直到找到一个没有的元素 把它变成回文。如果你检查整个队列没有错误,那么你有一个回文!
这是你可以做到的一种方式:
public static boolean isPalindrome(Queue<Integer> q) {
Stack<Integer> save = new Stack<Integer>();
if(q.isEmpty()){
return true;
}
for(int i = 0; i < q.size(); i++){
int n = q.remove();
save.push(n);
q.add(n);
}
for(int j = 0; j < q.size(); j++){
int a = q.remove();
int b = save.pop();
if(a != b){
return false; // cannot be a palindrome
}
q.add(a);
}
return true;
}