给定数字 n,如何打印大小为 m 的所有子序列?
Posted
技术标签:
【中文标题】给定数字 n,如何打印大小为 m 的所有子序列?【英文标题】:How to print all subsequences of size m, given number n? 【发布时间】:2020-12-12 17:28:17 【问题描述】:针对以下问题:
数字的子序列是数字的一系列(不一定是连续的)数字。例如,12345 的子序列包括 123、234、124、245 等。您的任务是生成低于一定长度的子序列。
def generate_subseq(n, m):
"""
Print all subsequence of length at most m that can be found in the given number n.
For example, for n = 20125 and m = 3, we have that the subsequences are
201
202
205
212
215
225
012
015
025
125
>>> generate_subseq(20125, 3)
201
202
205
212
215
225
012
015
025
125
>>> generate_subseq(20125, 5)
20125
"""
以下是无效的解决方案:
package main
import (
"fmt"
"strconv"
)
func generateSubSequence(n int, subSequenceSize int) []int
digitSequence := intToSequenceOfDigits(n) // [2,0,1,2,5]
var f func([]int, int, int) []int
f = func(digitSequence []int, pickingIndex int, currentSubSequenceSize int) []int
if pickingIndex+1 == currentSubSequenceSize
value := sequenceOfDigitsToInt(digitSequence[0:currentSubSequenceSize])
return []intvalue
if currentSubSequenceSize == 0
return []int
digit := digitSequence[pickingIndex]
withM := mapDigit(f(digitSequence, pickingIndex-1, currentSubSequenceSize-1), digit)
withoutM := f(digitSequence, pickingIndex-1, currentSubSequenceSize)
return append(withM, withoutM...)
return f(digitSequence, len(digitSequence)-1, subSequenceSize)
func mapDigit(slice []int, digit int) []int
result := make([]int, len(slice))
for i, value := range slice
result[i] = value*10 + digit
return result
func sequenceOfDigitsToInt(digits []int) int
result := 0
for _, value := range digits
result = result*10 + value
return result
func intToSequenceOfDigits(n int) []int // [2,0,1,2,5]
var convert func(int) []int
sequence := []int
convert = func(n int) []int
if n != 0
digit := n % 10
sequence = append([]intdigit, sequence...)
convert(n / 10)
return sequence
return convert(n)
func main()
fmt.Println(generateSubSequence(20125, 3))
实际输出为:[225 215 205 212 202 201]
预期输出为:[201 202 205 212 215 225 012 015 025 125]
为什么实际输出缺少一些子序列?比如125
等等……
【问题讨论】:
提示:通过选择第一个数字,然后从右边的数字中选择长度为 m-1 的子序列,可以得到长度为 m 的子序列。 您也可以使用二进制表示的数字的集合位来获取子序列。 问题没有说清楚。第一个示例显示了所有长度的组合,但第二个示例 - 仅长度为 3 的组合。示例还说“最大数是 225,所以我们的答案是 225”,而问题没有提到最大值。 @MBo 查询编辑了适当的细节 【参考方案1】:这样的?修改我的另一个answer:
function f(s, i, l)
if (i + 1 == l)
return [s.substr(0, l)];
if (!l)
return [''];
const left = f(s, i - 1, l);
const right = f(s, i - 1, l - 1);
return left.concat(
right.map(x => x + s[i]));
var input = [
['20125', 3],
['12345', 3]
];
for (let [s, l] of input)
console.log(s + ', l: ' + l);
console.log(JSON.stringify(f(s, s.length-1, l)));
console.log('');
【讨论】:
但是输出不匹配...对于 (20125, 3),我们还应该看到输出012
, 025
, 125
。与 (12345, 3) 相同,我们应该看到输出 235
、234
等...
@overexchange 错过了那个。现在怎么样?
@overexchange 对不起,我不懂语言,Go。也许您可以向 *** 发布一个包含您的代码并寻求帮助的问题?
我在现有问题中加入了 GO 标签以上是关于给定数字 n,如何打印大小为 m 的所有子序列?的主要内容,如果未能解决你的问题,请参考以下文章
2022-12-22:给定一个数字n,代表数组的长度, 给定一个数字m,代表数组每个位置都可以在1~m之间选择数字, 所有长度为n的数组中,最长递增子序列长度为3的数组,叫做达标数组。 返回达标数组的
2022-08-06:给定一个数组arr,长度为N,arr中所有的值都在1~K范围上, 你可以删除数字,目的是让arr的最长递增子序列长度小于K。 返回至少删除几个数字能达到目的。 N <= 10^4
2022-06-16:给定一个数组arr,含有n个数字,都是非负数, 给定一个正数k, 返回所有子序列中,累加和最小的前k个子序列累加和。 假设K不大,怎么算最快? 来自亚马逊。