求助:寻找HackerRank中输入输出数据的转换算法模式
嘿,你之前的反转相加思路其实在不少案例上都命中了,但20的情况确实卡壳了——我仔细对比了输入输出的对应关系,发现可以按数字的类型拆分出更完整的规律:
完整转换规则推导
我们先把输入输出一一对应列出来,方便观察:
| 输入 | 输出 |
|---|---|
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 4 |
| 5 | 5 |
| 10 | 11 |
| 11 | 22 |
| 15 | 66 |
| 20 | 111 |
1. 一位数输入(1-5)
这类输入的输出和输入完全一致,规则很直接:输出等于原数。
2. 两位数输入
我们可以把两位数再分成两类处理:
2.1 非10倍数的两位数(11、15)
计算输入数字的各位数字之和 s,输出是由两个s组成的两位数:
- 11的各位和:
1+1=2→ 输出22(两个2) - 15的各位和:
1+5=6→ 输出66(两个6)
其实这和你之前的反转相加思路结果一致:(10a+b)+(10b+a)=11(a+b)=11s,而11*s刚好就是两个s组成的两位数,比如11*2=22、11*6=66。
2.2 10倍数的两位数(10、20)
这类数的个位为0,取十位数字d,输出是由d+1个1组成的整数:
- 10的十位数字是1 →
1+1=2个1 → 输出11 - 20的十位数字是2 →
2+1=3个1 → 输出111
总结算法步骤
对于每个输入数字num:
- 如果
num是一位数(1≤num≤9),输出num; - 如果
num是两位数:- 若
num % 10 == 0(即10的倍数):- 取十位数字
d = num // 10 - 输出由
d+1个'1'拼接成的整数
- 取十位数字
- 否则:
- 计算各位和
s = (num//10) + (num%10) - 输出
11 * s(或直接拼接两个s成两位数)
- 计算各位和
- 若
这个规则完全匹配所有给定的输入输出,应该就是题目要求的转换模式了。
内容的提问来源于stack exchange,提问作者Rahadian Permana
相关产品推荐
相关产品推荐

