【问题标题】:How can I solve this java programming challenge involving queues with the minimum memory requirement?如何解决这个涉及具有最低内存要求的队列的 Java 编程挑战?
【发布时间】: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


【解决方案1】:

您不应该使用简单的算法来解决这个问题。正如您在 test20 中看到的,当 n=1000000000 时,解决问题的成本太高了。

你可以用纯数学来解决这个问题。例如,将 x,y,z 分成 (xyz) (xxyyzz) (xxxyyyzzz) 之类的组,并减少每个组的数量以获得特定组,然后 mod n(根据您找到的组)找出哪个输出应该是。

【讨论】:

    【解决方案2】:

    我认为你不能在队列中创建这么多 String 对象。

    你可以使用一个整数队列,用person数组的索引值。

    编辑:

    从url看到问题后,我觉得你真的不用搬人了。

    1. 将问题分解为小步骤,由每个人来处理。

    2. 队列中每个人的数量,每一步增加两倍。

    3. 最后一步不能处理所有人,所以统计人的索引。

    这是代码,可以接受:

    public class Line {
        public static String WhoIsNext(String[] names, int n)
        {
            // Your code is here...
            final int personNum = names.length;
            int loop = 1;
            int curPersonQueueNum = personNum * loop;
            while (n > curPersonQueueNum){
                n -= curPersonQueueNum;
                loop*=2;
                curPersonQueueNum = personNum * loop;
            }
            n = (int) Math.ceil((double)n / loop);
            return names[n - 1];
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2019-03-21
      • 1970-01-01
      • 1970-01-01
      • 2016-11-21
      • 2014-08-12
      • 1970-01-01
      • 2020-10-11
      • 1970-01-01
      • 2015-11-08
      相关资源
      最近更新 更多