【问题标题】:Reodering list elements using a cirtain step使用特定步骤重新排序列表元素
【发布时间】:2022-11-27 04:46:49
【问题描述】:

我正在解决以下问题:

圆桌上摆着numberOfDishes编号为升序1numberOfDishes。一个人想按照以下规则尝试所有的菜:

他会吃完everyDishNumberToEat的每道菜,直到他吃完为止 一切。

输入:

numberOfDishes = 10
everyDishNumberToEat = 3

dishes: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

输出:

[3, 6, 9, 2, 7, 1, 8, 5, 10, 4]

这是我的代码,我试图从LinkedList 获取每道菜的编号并添加到我的列表中。你知道如何解决这个问题吗?谢谢!

public class DishOrderDeterminer {
    public List<Integer> determineDishOrder(int numberOfDishes, int everyDishNumberToEat) {
        LinkedList<Integer> linkedList = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        for (int i = 1; i <= numberOfDishes; i++) {
            linkedList.add(i);
        }

        for (int i = 0; i < numberOfDishes; i++) {
            int n = linkedList.remove(everyDishNumberToEat+i);
            list.add(n);
        }

        return list;
    }
}

【问题讨论】:

标签: java arrays algorithm loops linked-list


【解决方案1】:

考虑以下:

  • 要从菜肴列表中删除的元素的索引应该不是在每次迭代中增加1就像您在共享的代码中所做的那样),但根据给定的everyDishNumberToEat进行了更改。 IE。我们需要用 curtain step 重复遍历菜品列表,并且 index 需要这样改变:
i = (i + (everyDishNumberToEat - 1)) % dishes.size();

// modulus is need because we need to move the list multiple times,
// until there would be no dishes left (and we don't want
// to exceed the current size of the list)
  • 您需要迭代直到菜品列表是空的(目标是吃全部菜品谢幕).列表中的单次迭代是不够的,因为我们正在跳过元素。 while-loop 更适合这个目的。

这就是它可能的实现方式:

public static List<Integer> determineDishOrder(int numberOfDishes, int everyDishNumberToEat) {
    List<Integer> dishes = new LinkedList<>();
    List<Integer> result = new ArrayList<>();
    
    for (int i = 1; i <= numberOfDishes; i++) {
        dishes.add(i);
    }
    
    int step = everyDishNumberToEat - 1;
    int i = 0;
    while (!dishes.isEmpty()) {
        i = (i + step) % dishes.size();
        int n = dishes.remove(i);
        result.add(n);
    }
    
    return result;
}

main()

public static void main(String[] args) {
    System.out.println(determineDishOrder(10, 3));
}

输出:

[3, 6, 9, 2, 7, 1, 8, 5, 10, 4]

【讨论】:

  • 嗨亚历山大,感谢您提供详细信息,这非常有帮助!
  • @DARASolutions 很高兴知道。你能请edit问题并添加输出你的代码产生?这是问题的重要组成部分。 StackOverflow 上的问题应该为未来的读者带来价值,因此提供完整和清晰的问题描述很重要,这样其他人也可以从您的问题中受益。请花一点时间进行编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2012-12-12
  • 2018-05-08
  • 2017-11-11
  • 2022-01-03
  • 2011-03-04
  • 1970-01-01
相关资源
最近更新 更多