环形餐桌固定步长取菜顺序求解:Java算法实现技术咨询
修正环形取菜问题的LinkedList实现
你的原代码存在核心逻辑错误:直接用everyDishNumberToEat+i作为移除索引完全不符合环形计数规则,而且每次移除元素后列表长度会动态变化,固定偏移不仅会导致索引越界,也无法实现“数到第N个就取走”的循环逻辑。
结合你提供的参考逻辑片段,下面是修正后的完整实现:
import java.util.ArrayList; import java.util.LinkedList; import java.util.List; public class DishOrderDeterminer { public List<Integer> determineDishOrder(int numberOfDishes, int everyDishNumberToEat) { LinkedList<Integer> dishes = new LinkedList<>(); List<Integer> result = new ArrayList<>(); // 初始化菜肴列表 for (int i = 1; i <= numberOfDishes; i++) { dishes.add(i); } int step = everyDishNumberToEat - 1; int currentIndex = 0; // 循环取菜直到所有菜肴被取完 while (!dishes.isEmpty()) { // 计算下一个要取的菜肴索引,取模实现环形循环 currentIndex = (currentIndex + step) % dishes.size(); // 移除该索引的菜肴并加入结果列表 int removedDish = dishes.remove(currentIndex); result.add(removedDish); } return result; } }
关键逻辑说明
- 步长转换:
step = everyDishNumberToEat - 1,因为我们从当前索引开始计数,数到第everyDishNumberToEat个元素时,实际需要偏移的步数是everyDishNumberToEat - 1(比如从索引0开始数3个,最终指向索引2)。 - 环形索引计算:
currentIndex = (currentIndex + step) % dishes.size(),通过取模运算保证索引始终在当前列表的有效范围内,实现餐桌的环形循环效果。 - 动态列表处理:每次移除元素后列表长度自动缩短,下一次计算会基于新的列表长度调整索引,确保计数准确。
测试你给出的示例:numberOfDishes = 10,everyDishNumberToEat = 3,运行后会得到预期输出[3, 6, 9, 2, 7, 1, 8, 5, 10, 4]。
内容的提问来源于stack exchange,提问作者DARA Solutions
相关产品推荐
相关产品推荐

