dxxbjl 发表于 2023-4-6 17:11

java - 按数位和排序

本帖最后由 dxxbjl 于 2023-4-6 17:14 编辑

题:

当 两个数各个数位之和不同时, 将数位和较小的排在前面, 当数位之和相等时, 将数值小的排在前面。
给定正整数n,m, 请问对 1 到 n 采用这种方法排序时, 排在第m 个的元 素是多少?
示例:
1 到 13 的排序为: 1,10,2,11,3,12,4,13,5,6,7,8,9。第 5 个数为 3 。
思路:

1、求数位和
2、对数位和进行排序
3、如果数位和不相等,按数位和由小到大排
4、如果数位和相等,按原数值大小排
5、求第m位数字是啥


-- 需要使用到数位值和原数--
怎么放?
1、二维数组
2、Map
怎么排序?
重写排序方法

https://static.52pojie.cn/static/image/hrline/4.gifhttps://static.52pojie.cn/static/image/hrline/4.gif
实现代码
public static void main(String[] args) {
                // TODO Auto-generated method stub
                Scanner sc =new Scanner(System.in);
                int n = sc.nextInt();
                int m =sc.nextInt();
                //排序后第m个数是什么?
                System.out.println(findMNumber(n, m));
      }

      //排序、返回第m个数
      public static intfindMNumber(int n,int m) {
                //题目要求:1、求位数和;2、按位数和由小到大排;3、位数和相等则按数值由小到达;4、从1排到n,求第m个数
                //分解:位数和、数值。--> 二维数组         --> 第一行存放数值,第二行存放位数和
               
                //定义一个二维数组,n列2行
                int[][] nums = new int;
                for(int i=0;i<n;i++) {
                        //从1开始排,拍到n
                        nums = i+1;
                        //求位数和,然后放进第二行
                        nums = digitSum(i+1);
                }
               
                //对数组进行排序
                //Java语言提供了一个Arrays.sort()方法可以对数组进行排序,
                //这个方法的第一个参数是要排序的数组,第二个参数是一个Comparator类型的函数接口,它用于指定排序的规则。

                /*
               * 通过Lambda表达式实现了Comparator接口的compare()方法
               * 首先,我们判断数组中的两个数 a 和 b 的数位之和是否相等。
               * 如果它们的数位之和不相等,我们就将数位之和较小的那个数排在前面,
               * 否则就按照数值的大小来排序。
               * */
                Arrays.sort(nums,(a,b)->{      
                        //nums是一个二维数组,第一行a我们存放了数值,第二行a我们存放了数位和
                        
                        //每行元素又可以看成是一个一维数组,所以a和a表示的是一维数组的数组名,
                        //所以a就表示了第一行这个一维数组的第一个数字,即nums中的a。
                        //而a就代表了第二行这个一维数组的第一个元素即nums中的a,
                        //综上,在这里 a代表的是数位和,a代表的是数值
                        
                        //所以我们判断 数位和是否相等,若不等则按数位和排序
                        if(a != b) {      
                              return Integer.compare(a, b);
                        }
                        //若相等则按数值排序
                        return Integer.compare(a, b);
                });
               
                return nums;
      }
      
      //计算位数和
      public static int digitSum(int num) {
               
                int sum =0;
                while(num>0) {
                        sum += num%10;         //最后一位数字通过 取模 获得
                        num /= 10;                //把num向前推一位
                }
                return sum;
      }

dxxbjl 发表于 2023-4-6 17:13

本帖最后由 dxxbjl 于 2023-4-6 17:17 编辑

使用map,key存数值,value存数位和,然后重写比较方法

rosguy 发表于 2023-4-6 22:42

本帖最后由 rosguy 于 2023-4-6 22:43 编辑

用javascript写了个const m = 120, n = 88;
const numArr = Array.from(Array(m), (_, idx) => idx + 1);
const TransNumer = num => {
    const s = String(num).split('').reduce((p,v) => p += +v, 0);
    const t = String(num).padStart(String(m).length, 0);
    return(s + t);
}
const sortArr = numArr.map(e => ).sort((a,b) => a - b);
console.log(sortArr);   // 65
页: [1]
查看完整版本: java - 按数位和排序