多多的数字组合 JS递归实现

1 篇文章 0 订阅
1 篇文章 0 订阅

多多的数字组合 JS递归实现

题目:

传送门
多多君最近在研究某种数字组合:
定义为:每个数字的十进制表示中(0~9),每个数位各不相同且各个数位之和等于N。
满足条件的数字可能很多,找到其中的最小值即可。
多多君还有很多研究课题,于是多多君找到了你–未来的计算机科学家寻求帮助。

数据范围: 1 \le n \le 1000 \1≤n≤1000
进阶:空间复杂度 O(1) \O(1) ,时间复杂度 O(n) \O(n)

链接:https://www.nowcoder.com/questionTerminal/3d6b53e097ea41bda049d111f30db28e
来源:牛客网

输入描述:
共一行,一个正整数N,如题意所示,表示组合中数字不同数位之和。
(1 <= N <= 1,000)

输出描述:
共一行,一个整数,表示该组合中的最小值。
如果组合中没有任何符合条件的数字,那么输出-1即可。
示例1
输入

5

输出

5

说明

符合条件的数字有:`5,14,23,32,41`
其中最小值为`5`

示例2
输入

12

输出

39

示例3
输入

50

输出

-1

说明

没有符合条件的数字 (T▽T) 

思路:

1、从示例三可以发现,输入的数字超过某个值时没有符合条件的数字。再回去读题目发现,新组成的数每个数位上的数各不相同,所以输入的数最大为:9×10/2=45(这里0 不影响,所以n=9,即 n×(n+1)/2)。那么当输入的值大于45时,直接输出-1就好了。

2、要找出其中的最小值,那么不管 0 放在哪一位,都会导致组成的数多了一位,所以组成的数里有 0 的直接不用考虑;当输入数字小于 10 时,其本身就是最小值。

3、要想使组成的数尽可能的小,则高位的数越小越好,即低位的数尽可能的大;那么就是从个位开始算,一直往高位推,也就是个位为9,十位为8,……(记住每个位上的数字不相同)。所以可以用递归实现。

4、这道题为ACM模式,那么输入要自己去拿,输出要自己控制。可以看到为单行输入,所以用readline()就可以拿到输入,输出为单行,没啥格式要求,直接console.log()打印就好。

代码实现:

var compute = function(input,num){
    if(input <= num){//得到最高位的数值,递归结束
        return input;
    }
    return num + compute((input - num),num - 1) * 10;
}

let inputNum = parseInt(readline());//读取输入,并将字符转换为整数
if(inputNum > 45)
    console.log(-1);
else if(inputNum < 10)
    console.log(inputNum);
else{
    console.log(compute(inputNum,9));
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值