【发布时间】:2016-03-16 03:08:43
【问题描述】:
所以我遇到了这个编程挑战http://www.codewars.com/kata/double-cola,我有一个队列中的人员列表,每次有人到达第一个位置时,它就会翻倍并排在队列的末尾。
例如我有 x,y,z
x,y,z 下一个循环是 y,z,x,x 然后 z,x,x,y,y 然后 x,x,y,y,z,z 然后 x,y,y,z,z,x,x 然后 y,y,z, z,x,x,x,x 等
这是我在eclipse中完美运行的代码。
public class Line {
static Node first;
static Node last;
static int N;
private static class Node
{
String name;
Node next;
}
public static boolean isEmpty() { return first == null; }
public static void enqueue(String name)
{
Node oldlast = last;
last = new Node();
last.name = name;
last.next = oldlast;
if(isEmpty()) first = last;
else oldlast.next = last;
N++;
}
public static String dequeue()
{
String name = first.name;
first = first.next;
N--;
if(isEmpty()) last = null;
return name;
}
public static String WhoIsNext(String[] names, int n)
{
// Your code is here...
for(int i = 0; i < names.length; i++) enqueue(names[i]);
for(int i = 0; i < n; i++)
{
String name = dequeue();
enqueue(name);
enqueue(name);
}
return last.name;
}
}
现在的问题是,当我运行它时,程序启动良好,给出了正确的答案,但在 12 次测试时它开始给我一个错误的答案。例如,给 WhoIsNext 方法一个 n = 3667 我在 Eclipse 中具有相同代码的答案是 = Penny,这是正确答案,但在编码网页中它给了我 = Leonard 所以我的假设是记忆开始结束所以程序在 12/13 测试后开始给出错误答案。如何改进我的代码以通过所有测试?
这是测试。
public class ListTests {
@Test
public void test1() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 1;
assertEquals("Sheldon", new Line().WhoIsNext(names, n));
}
@Test
public void test2() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 6;
assertEquals("Sheldon", new Line().WhoIsNext(names, n));
}
@Test
public void test3() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 1802;
assertEquals("Penny", new Line().WhoIsNext(names, n));
}
@Test
public void test4() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 2;
assertEquals("Leonard", new Line().WhoIsNext(names, n));
}
@Test
public void test6() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 10;
assertEquals("Penny", new Line().WhoIsNext(names, n));
}
@Test
public void test7() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 534;
assertEquals("Rajesh", new Line().WhoIsNext(names, n));
}
@Test
public void test8() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 5033;
assertEquals("Howard", new Line().WhoIsNext(names, n));
}
@Test
public void test9() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 10010;
assertEquals("Howard", new Line().WhoIsNext(names, n));
}
@Test
public void test10() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 63;
assertEquals("Rajesh", new Line().WhoIsNext(names, n));
}
@Test
public void test11() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 841;
assertEquals("Leonard", new Line().WhoIsNext(names, n));
}
@Test
public void test12() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 3667;
assertEquals("Penny", new Line().WhoIsNext(names, n));
}
@Test
public void test13() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 38614;
assertEquals("Howard", new Line().WhoIsNext(names, n));
}
@Test
public void test14() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 1745;
assertEquals("Leonard", new Line().WhoIsNext(names, n));
}
@Test
public void test15() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 8302;
assertEquals("Rajesh", new Line().WhoIsNext(names, n));
}
@Test
public void test16() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 12079;
assertEquals("Sheldon", new Line().WhoIsNext(names, n));
}
@Test
public void test17() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 28643950;
assertEquals("Leonard", new Line().WhoIsNext(names, n));
}
@Test
public void test18() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 159222638;
assertEquals("Howard", new Line().WhoIsNext(names, n));
}
@Test
public void test19() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 121580142;
assertEquals("Penny", new Line().WhoIsNext(names, n));
}
@Test
public void test20() {
String[] names = new String[] { "Sheldon", "Leonard", "Penny", "Rajesh", "Howard" };
int n = 1000000000;
assertEquals("Penny", new Line().WhoIsNext(names, n));
}
}
【问题讨论】:
-
@FallAndLearn 假设我们有 x y z 作为队列中的 3 个人,n 将是我们需要执行的出队次数或队列中的移动次数,因此如果 n 为 0,则它保持相同 x y z , 当 n 为 1 时现在是 y z x x 如果 n 是 2 那么现在是 z x x y y 如果它是 3 那么 x x y y z z 等等。给定 n,我们需要返回队列中最后一个人的姓名。因此,如果他们再次给我们 n =2,我们将拥有像这样的队列 z x x y y 所以我们返回 y 的名称,因为它是队列中的最后一项。
标签: java eclipse algorithm queue