【发布时间】:2014-06-18 19:49:49
【问题描述】:
我编写了一个冗长而复杂的方法来检查 Queue 中的元素列表是否为回文。我知道它可以改进,但我现在的目标是让它通过所有实践测试。我已经通过了 9 分(满分 10 分),但我似乎无法通过的唯一测试是奇数元素/不是回文。
例如: 前 [5, 10, -1, 4, 3, 2, 2, 4, -1, 10, 5] 后。预期输出应为 FALSE。我的输出是 TRUE。
此外,与其他测试不同,队列中的元素不会被显示。与之前提出的与此问题类似的问题不同,我的队列必须恢复到其原始状态。到目前为止,这是我的代码:
public static boolean isPalindrome(Queue<Integer> q) {
Stack<Integer> s = new Stack<Integer>();
int size = q.size();
int extra = 0;
if(q.isEmpty())
return true;
else
if (size % 2 == 0) {
for (int i = 0; i < size / 2; i++) {
s.push(q.remove());
}
while (!s.isEmpty()) { // While Stack is not empty:
if (s.peek() != q.peek()) {
int first = s.pop();
s.push(q.remove());
s.push(first);
while (!q.isEmpty())
s.push(q.remove());
while (!s.isEmpty()) {
q.add(s.pop());
}
return false;
}
else {
while (!q.isEmpty())
s.push(q.remove());
while (!s.isEmpty()) {
q.add(s.pop()); // Restore Queue to original order
}
return true;
}
}
for (int k = 0; k < size / 2; k++) {
q.add(q.remove());
s.push(q.remove());
}
for (int l = 0; l < size / 2; l++)
s.push(q.remove());
while (!s.isEmpty())
q.add(s.pop());
}
return true;
}
如果有人在阅读本文时遇到困难,或者可以提出一种方法来减少它的复杂性,我将不胜感激。谢谢,对于臃肿的代码再次抱歉。
【问题讨论】:
-
检查回文的复杂代码很多
-
@Cruncher 同意了。为什么不直接将元素转换为字符串并使用 StringBuilder.reverse() 和一个很好的旧 .equals() 比较?
-
@MarkW 还有比这更有效、更通用的解决方案。在这种情况下,实际上并不是那么简单,因为 [21, 25, 21] 如果你创建一个字符串是“212521”,如果你反转你会得到“125212”,这与原来的非常不同。但是只要有一个列表并不断比较索引
i和索引length-i-1就可以了。适用于您可以调用 equals 的任何数据类型。 -
@Cruncher 是的,我忽略了这一点,所以 +1。
-
@Cruncher 该死的你和你无懈可击的逻辑!
标签: java stack queue palindrome