如何不重复地创建从1到N的M个自然数的序列?
how to create A sequence of M natural numbers from 1 to N without duplication?
写一个函数returns所有Barcode当M必须是偶数时可以在数组中创建1到N的自然数序列,长度必须为M.*
条件
- 序列必须按字典顺序递增打印。
- 条形码 必须作为数字返回。
function test (N, M) {
};
输出应该如下所示
const output1 = 测试(2, 1);
console.log(输出1); // --> [1, 2]
const output2 = 测试(3, 2);
console.log(输出2); // --> [12, 13, 21, 23, 31, 32]
const output3 = 测试(3, 3);
console.log(输出3); // --> [123, 132, 213, 231, 312, 321]
我已经尝试解决这个问题好几个小时了,但我仍然无法解决。 ... 甚至很难开始。
如果您能帮我解决代码,我将不胜感激。
试试这个
const test = (n, m) => {
if(m > n){
return []
}
const numbers = Array(n).fill(1).map((n, i) => (n + i).toString())
const loop = (arr, res, elements) => {
if (elements === 0) {
return res.join('')
}
return arr.flatMap((a, i) => loop(arr.filter(b => b !== a), [...res, a], elements - 1))
}
return loop(numbers, [], m)
}
console.log(test(1, 1))
console.log(test(2, 1))
console.log(test(3, 2))
console.log(test(5, 3))
说明
首先检查以确保 m
小于 n
因为在那种情况下没有可能的组合
这个函数内部使用递归函数loop
来计算所有可能的长度组合m
参数是
- arr一个元素数组
- res 前一个选定元素的累加器
- elements缺少的元素个数
首先调用循环函数,numbers
作为数组,空数组作为 res
和 m
作为元素数
首先检查 elements
是否为零(退出条件)
然后它获取 arr 并对其进行 flatMap
Foreach 元素它使用参数
递归调用 loop
函数
- arr 没有当前元素的前一个数组
- res 上一个res + 这个元素
- 元素 - 1
示例 (2, 2)
首先运行
循环 (['1', '2'], [], 2)
元素 > 0
loop(['2'], ['1'], 1)
- loop([], ['1', '2'], 0) -> return ['1', '2'].join('') = '12'
loop(['1'], ['2'], 1)
- loop([], ['2', '1'], 0) -> return ['2', '1'].join('') = '21'
写一个函数returns所有Barcode当M必须是偶数时可以在数组中创建1到N的自然数序列,长度必须为M.*
条件
- 序列必须按字典顺序递增打印。
- 条形码 必须作为数字返回。
function test (N, M) {
};
输出应该如下所示
const output1 = 测试(2, 1); console.log(输出1); // --> [1, 2]
const output2 = 测试(3, 2); console.log(输出2); // --> [12, 13, 21, 23, 31, 32]
const output3 = 测试(3, 3); console.log(输出3); // --> [123, 132, 213, 231, 312, 321]
我已经尝试解决这个问题好几个小时了,但我仍然无法解决。 ... 甚至很难开始。 如果您能帮我解决代码,我将不胜感激。
试试这个
const test = (n, m) => {
if(m > n){
return []
}
const numbers = Array(n).fill(1).map((n, i) => (n + i).toString())
const loop = (arr, res, elements) => {
if (elements === 0) {
return res.join('')
}
return arr.flatMap((a, i) => loop(arr.filter(b => b !== a), [...res, a], elements - 1))
}
return loop(numbers, [], m)
}
console.log(test(1, 1))
console.log(test(2, 1))
console.log(test(3, 2))
console.log(test(5, 3))
说明
首先检查以确保 m
小于 n
因为在那种情况下没有可能的组合
这个函数内部使用递归函数loop
来计算所有可能的长度组合m
参数是
- arr一个元素数组
- res 前一个选定元素的累加器
- elements缺少的元素个数
首先调用循环函数,numbers
作为数组,空数组作为 res
和 m
作为元素数
首先检查 elements
是否为零(退出条件)
然后它获取 arr 并对其进行 flatMap
Foreach 元素它使用参数
递归调用loop
函数
- arr 没有当前元素的前一个数组
- res 上一个res + 这个元素
- 元素 - 1
示例 (2, 2)
首先运行 循环 (['1', '2'], [], 2)
元素 > 0
loop(['2'], ['1'], 1)
- loop([], ['1', '2'], 0) -> return ['1', '2'].join('') = '12'
loop(['1'], ['2'], 1)
- loop([], ['2', '1'], 0) -> return ['2', '1'].join('') = '21'