吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 590|回复: 2
收起左侧

[学习记录] java - 按数位和排序

[复制链接]
dxxbjl 发表于 2023-4-6 17:11
本帖最后由 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
怎么排序?
重写排序方法


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

                /*
                 * 通过Lambda表达式实现了Comparator接口的compare()方法
                 * 首先,我们判断数组中的两个数 a 和 b 的数位之和是否相等。
                 * 如果它们的数位之和不相等,我们就将数位之和较小的那个数排在前面,
                 * 否则就按照数值的大小来排序。
                 * */
                Arrays.sort(nums,(a,b)->{        
                        //nums是一个二维数组,第一行a[0]我们存放了数值,第二行a[1]我们存放了数位和
                        
                        //每行元素又可以看成是一个一维数组,所以a[0]和a[1]表示的是一维数组的数组名,
                        //所以a[0]就表示了第一行这个一维数组的第一个数字,即nums中的a[0][0]。
                        //而a[1]就代表了第二行这个一维数组的第一个元素即nums中的a[1][0],
                        //综上,在这里 a[1]代表的是数位和,a[0]代表的是数值
                        
                        //所以我们判断 数位和是否相等,若不等则按数位和排序
                        if(a[1] != b[1]) {        
                                return Integer.compare(a[1], b[1]);
                        }
                        //若相等则按数值排序
                        return Integer.compare(a[0], b[0]);
                });
                
                return nums[m-1][0];
        }
        
        //计算位数和
        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写了个
[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 => [e, TransNumer(e)]).sort((a,b) => a[1] - b[1]);
console.log(sortArr[n-1][0]);   // 65
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则 警告:本版块禁止回复与主题无关非技术内容,违者重罚!

快速回复 收藏帖子 返回列表 搜索

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-5-23 14:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表