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:17 编辑
使用map,key存数值,value存数位和,然后重写比较方法 本帖最后由 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]