如何实现支持任意起止值的星期数字区间提取算法?
解决星期数字区间提取问题
这个问题其实很好处理,核心就是区分不跨周末和跨周末两种情况,直接分逻辑实现就好,我给你写几个常用语言的实现,逻辑清晰还容易维护:
Python 实现
def get_weekday_range(from_day, to_day): # 先做参数合法性校验,避免非法输入 if not (0 <= from_day <= 6 and 0 <= to_day <= 6): raise ValueError("from_day 和 to_day 必须是 0-6 之间的整数") if from_day <= to_day: # 不跨周末:直接生成从 from_day 到 to_day 的连续列表 return list(range(from_day, to_day + 1)) else: # 跨周末:先取 from_day 到周六(6),再取周日(0)到 to_day,合并两个列表 return list(range(from_day, 7)) + list(range(0, to_day + 1))
测试示例
get_weekday_range(1, 4)→ 返回[1, 2, 3, 4](周一到周四)get_weekday_range(5, 2)→ 返回[5, 6, 0, 1, 2](周五到周二)get_weekday_range(6, 0)→ 返回[6, 0](周六到周日)get_weekday_range(3, 3)→ 返回[3](仅周三)
JavaScript 实现
如果是前端场景,也可以用类似逻辑:
function getWeekdayRange(fromDay, toDay) { if (fromDay < 0 || fromDay > 6 || toDay < 0 || toDay > 6) { throw new Error("fromDay 和 toDay 必须是 0-6 之间的整数"); } const result = []; if (fromDay <= toDay) { for (let i = fromDay; i <= toDay; i++) { result.push(i); } } else { // 先添加 fromDay 到周六的数字 for (let i = fromDay; i <= 6; i++) { result.push(i); } // 再添加周日到 toDay 的数字 for (let i = 0; i <= toDay; i++) { result.push(i); } } return result; }
核心逻辑说明
不管用哪种语言,核心思路都是:
- 当起始值小于等于结束值时,直接提取连续区间
- 当起始值大于结束值时,把区间拆成「起始值到周六」和「周日到结束值」两部分,再合并
这种实现方式可读性强,也方便后续扩展(比如要把数字映射成星期名称,直接在生成列表时做转换即可)。
内容的提问来源于stack exchange,提问作者denis jardot
相关产品推荐
相关产品推荐

