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

JavaScript实现1~N选M无重复数生成字典序升序数字条码数组的方法

问题描述

John制作了仅由1、2、3组成的序列条码,随着物品数量增加,他需要重新实现算法生成和现有条码不同的新序列条码。要求从1到N的自然数中无重复选取M个,生成长度为M的序列条码,所有符合要求的条码按字典序升序排列,最终以数字类型存放在数组中返回。

输入输出要求

输入要求

  • 参数1:1~10范围内的自然数n
  • 参数2:1到n之间的自然数m
  • 返回值:包含所有符合要求的数字条码的数组

输入输出示例

所有条码不能出现重复数字:

  1. 当N=2、M=1时,用1或2生成长度为1的条码:
construct1 = test2(2, 1);
console.log(construct1); // --> [1, 2]
  1. 当N=3、M=2时,用1、2、3生成长度为2的条码:
construct2 = test2(3, 2);
console.log(construct2); //-> [12, 13, 21, 23, 31, 32]
现有代码问题

原有代码入参为数组和m,不符合题目要求的入参为两个自然数N、M的规则,且输出是嵌套数组,不是题目要求的数字数组。

修正后的完整代码
function test2(n, m){         
    let answer = [];
    // 生成1到n的升序初始数组,保证最终结果是字典序
    let arr = Array.from({length: n}, (_, index) => index + 1);
    let ch = Array.from({length: n}, () => 0);
    let tmp = Array.from({length: m}, () => 0);
    function DFS(L){
        if(L === m){
            // 将临时数组拼接为字符串后转成数字,存入结果
            answer.push(Number(tmp.join('')));
        } else {
            for(let i = 0; i < n; i++){
                if(ch[i] === 0){
                    ch[i] = 1;
                    tmp[L] = arr[i];
                    DFS(L + 1);
                    ch[i] = 0;
                }
            }
        }
    }
    DFS(0);
    return answer;
}

// 测试用例
console.log(test2(2, 1)); // 输出 [1, 2]
console.log(test2(3, 2)); // 输出 [12, 13, 21, 23, 31, 32]
修改点说明
  • 调整函数入参为题目要求的n、m两个自然数参数
  • 函数内部自动生成1~n的升序数组建模可选数字范围,保证生成的结果默认是字典序升序,无需额外排序
  • 递归终止条件中将原有的嵌套数组推入逻辑,修改为将临时数组的元素拼接为字符串后转数字存入结果,符合输出要求
  • 保留原有的DFS回溯去重逻辑,保证条码中不会出现重复数字

内容的提问来源于stack exchange,提问作者JinKaz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 04:36:02