我的回文检查器不是在某些工作,而是在其他工作? (JAVA)

时间:2014-02-25 00:40:52

标签: java stack

我正在尝试编写一个方法,该方法将整数队列作为参数,并检查队列是否为回文。

我的方法似乎适用于大多数队列但不适用于其他队列?我无法确定那些与之无关的特征......

这是我的代码:

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

3 个答案:

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