一、题目
输入若干个int类型整数,将整数按照位数由大到小排序,如果位数相同,则按照整数本身从小到大排序。例如,
输入:10 -3 1 23 89 100 9 -123
输出:-123 100 10 23 89 -3 1 9
输入的整数个数最多不超过1 0 6 10^610
6
个。
输入格式
在一行中输入若干个整数,整数之间用一个空格分隔。
输出格式
在一行中输出排序好的整数,整数之间用一个空格分隔。
二、思路
本题中排序按照每个数字的数位和数值
所以用到结构体排序
将每个数字分成两个部分
重写比较方法
用比较器将数字完成排序
三、代码实现
1、构造一个结构体
static class Val {
int num;
int dig;
//构造方法设置属性
Val(int num, int dig) {
this.num = num;
this.dig = dig;
}
}
2、计算数位以及编写比较器
static int getDigit(int num) {
int count = 0;
while (num != 0) {
count++;
num /= 10;
}
return count;
}
// 按照规则排序
Collections.sort(list, (Val a, Val b) -> {
if (a.dig != b.dig) {
return Integer.compare(b.dig, a.dig);
} else {
return Integer.compare(a.num, b.num);
}
});
}
3、数据读入
// 从命令行读取输入
Scanner scanner = new Scanner(System.in);
//读入完整一行
String line = scanner.nextLine();
//将完整一行以“ ”分割成单个字符
String[] numbers = line.split(" ");
// 创建一个列表来保存数字及其位数
List<Val> list = new ArrayList<>();
for (String numStr : numbers) {
int num = Integer.parseInt(numStr);
int dig = getDigit(num);
Val val = new Val(num, dig);
list.add(val);
}
4、完整代码
import java.util.*;
/**
* 输入若干个int类型整数,将整数按照位数由大到小排序,如果位数相同,则按照整数本身从小到大排序。例如,
*
* 输入:10 -3 1 23 89 100 9 -123
*
* 输出:-123 100 10 23 89 -3 1 9
*
* 输入的整数个数最多不超过1 0 6 10^610
* 6
* 个。
*/
class StructureSort {
//条件排序 每个对象有两个条件分别为本身值和位数
static class Val {
int num;
int dig;
//构造方法设置属性
Val(int num, int dig) {
this.num = num;
this.dig = dig;
}
}
public static void main(String[] args) {
// 从命令行读取输入
Scanner scanner = new Scanner(System.in);
//读入完整一行
String line = scanner.nextLine();
//将完整一行以“ ”分割成单个字符
String[] numbers = line.split(" ");
// 创建一个列表来保存数字及其位数
List<Val> list = new ArrayList<>();
for (String numStr : numbers) {
int num = Integer.parseInt(numStr);
int dig = getDigit(num);
Val val = new Val(num, dig);
list.add(val);
}
// 按照规则排序
Collections.sort(list, (Val a, Val b) -> {
if (a.dig != b.dig) {
return Integer.compare(b.dig, a.dig);
} else {
return Integer.compare(a.num, b.num);
}
});
// 输出排序后的结果
for (Val val : list) {
System.out.print(val.num + " ");
}
}
// 获取整数的位数
static int getDigit(int num) {
int count = 0;
while (num != 0) {
count++;
num /= 10;
}
return count;
}
}
四、总结
做题嘛,看到有意思的就做了,没有OJ环境啦,自己练着玩,写文章也是做笔记