多多的数字组合 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));
}