Java递归实现数字各位排序(禁用数组、分支循环等)求助
Java递归实现数字各位排序(无数组/条件/循环)
嘿,作为刚接触编程的新手,碰到这种带限制条件的递归问题确实容易卡壳,我来帮你梳理清楚可行的实现思路!
首先,咱们得抓住递归的核心:把大问题拆成重复的小问题。题目不让用数组、if/else、while,那咱们可以用三元运算符来替代判断逻辑(这是个合法的小技巧哦),同时用递归拆解数字的每一位。
整体思路
每次从当前数字中找到最小的那一位,把它放在结果的最高位,剩下的数字继续递归排序,直到数字被拆解完毕。咱们需要几个辅助递归方法来配合主排序方法:
1. 计算数字的位数(countDigits)
用来确定最小值需要乘以多少个10,才能放到结果的最高位:
public static int countDigits(int n) { // 三元替代if:如果n是0则位数为0,否则递归计算n/10的位数+1 return n == 0 ? 0 : 1 + countDigits(n / 10); }
2. 找到数字各位的最小值(findMin)
递归比较每一位数字,找出最小值:
public static int findMin(int n) { // 三元替代if:如果是个位数直接返回自己,否则比较最后一位和剩余部分的最小值 return n < 10 ? n : Math.min(n % 10, findMin(n / 10)); }
3. 移除数字中第一个出现的最小值(removeMin)
把最小值从原数字中移除一次,得到剩下的数字用于递归:
public static int removeMin(int n, int min) { // 三元替代if:如果最后一位是最小值,返回去掉最后一位的数字;否则递归处理剩余部分,再拼接当前最后一位 return n % 10 == min ? n / 10 : removeMin(n / 10, min) * 10 + (n % 10); }
4. 主排序方法(sortDigits)
把上面的方法组合起来,完成递归排序:
public static int sortDigits(int n) { // 三元替代if:如果n是0返回0,否则把最小值放到最高位,加上剩余数字的排序结果 return n == 0 ? 0 : findMin(n) * (int) Math.pow(10, countDigits(removeMin(n, findMin(n)))) + sortDigits(removeMin(n, findMin(n))); }
测试示例
比如调用sortDigits(13542),执行流程是:
- 找到最小值1,移除后得到3542
- 计算3542的位数是4,所以1*10^4=10000
- 递归排序3542得到2345
- 最终结果10000+2345=12345
注意点
- 这个实现默认处理正整数,如果需要处理负数,可以先取绝对值,最后再加上符号(同样用三元运算符判断正负)
Math.pow返回的是double,需要强转成int,确保位数计算正确
内容的提问来源于stack exchange,提问作者user9419993
相关产品推荐
相关产品推荐

