算法题 | 多多的数字组合

938 阅读3分钟

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

输入描述:

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

输出描述:

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

输入例子1:

5

输出例子1:

5

例子说明1:

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

输入例子2:

12

输出例子2:

39

例子说明2:

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

输入例子3:

50

输出例子3:

-1

例子说明3:

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

读题

一道通过枚举就可以得出结果的题

给定一个数字,要求各个数位上的数字之和等于它,而且要各不相同。 比如说:给一个数字——10。满足条件的有 19,28,37,73,45,还可以是 127,136。然后要取其中最小的,就是 19 了。

这个是怎么判断出来的,和已经给出来了,拿自然是取一个数少一个数。如果是要最后表示的数字中选最小的,肯定是位数越少越好。既然是越少越好。肯定是从个位数开始,从 9 开始取起,这样后面排到的差(十分位/百分数)就越少。即后面的数字越大,前面被分到的数字就越小。 比如,表示数字 19。 从个数为 9 开始,从后往前,上 8,还剩下差值为 2。最后最小的数字就是 289。像这样,从后往前,从 9 递减依次取,最后相差的用 Δ 补齐。

已知这样的数字组合规律后,为什么会有“没有符合条件的数字”呢?

答:原来,要求每个位数上的数字各不相同,而只有 0~9 中九个数字可以选,所以数字总会用完的。

按照这样的规律,依次列出,可以得到以下的表:

区间位数n
0~91n
10~18219~89
19~243189~789
25~3041789~6789
31~35516789~56789
36~396156789~456789
40~4271456789~3456789
43~44813456789~23456789
459123456789

到 45 这里,数字就被用完了。

到这里,数字表示随着数字的大小范围的变化就一目了然了。后面就是归纳了。

1.如果 x 在 [0,9] 之间,就为本身; 2.如果 x 在 [10,,18] 之间,就是 差值后跟上 9; 3.如果 x 在 [19,24] 之间,就是差值后跟上 89; ...

这时候当然是用一串 if-else 完成了!既然题目没有要求说最后结果要整数,那么就输出字符串(字符串拼接起来也方便)。

写&调试

import java.util.*;
/*
	[编程题]多多的数字组合 
	https://www.nowcoder.com/questionTerminal/3d6b53e097ea41bda049d111f30db28e
*/
public class Main {
	public static String func(int n) {
        String s = "";  
        // 0-9
        if (n <= 9)
            return s+n;
        // 10-18
        else if (n > 9 && n <= 18)
            return n-9+"9";
        // 19-24
        else if (n > 18 && n <= 24)
            return n-17+"89";
        // 25-30
        else if (n > 24 && n <= 30)
            return n-24+"789";
        // 31-35
        else if (n > 30 && n <= 35)
            return n-30+"6789";
        // 36-39
        else if (n > 35 && n <= 39)
            return n-35+"56789";
        // 40-42
        else if (n > 39 && n <= 42)
            return n-39+"456789";
        // 43-44
        else if (n > 42 && n <= 44)
            return n-42+"3456789";
        else if (n == 45)
            return "123456789";
        else
            return "-1";
    }
    
    
    public static void main(String[] args) {
        Scanner sn = new Scanner(System.in);
        int n = sn.nextInt();
        String res = "";
        System.out.println(func(n));
    }
}

结果

答案正确:恭喜!您提交的程序通过了所有的测试用例

小结

枚举出来数字,找到表示的规律就不难。