You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

环形餐桌固定步长取菜顺序求解: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 20:10:32