题目
思路
利用HashMap该数据结构的特点,因为1到n不会有重复,而且把它做为键,可以让数位之和做它的值
利用选择排序的思想,先根据数位之和进行排序,再根据其字面值进行排序,这样做的好处是不会有数被重复比较
代码
import java.util.*; // 1:无需package // 2: 类名必须Main, 不可修改 public class Main { static Map<Integer,Integer> map=new HashMap<>(); public static void main(String[] args) { //数据输入 Scanner scan = new Scanner(System.in); int n=scan.nextInt(); int m=scan.nextInt(); scan.close(); //将【1~n】保存到数组 int[] arr=new int[n]; for(int i=0;i<n;i++){ arr[i]=i+1; } //算法 sort(arr); //输出答案 System.out.println(arr[m-1]); } public static void sort(int[] arr){ //存储键值对 键为数字 值为该数字的数位之和 for(int i=0;i<=arr.length-1;i++){ int sum=0; for(int k=0;k<String.valueOf(arr[i]).length();k++){ sum += String.valueOf(arr[i]).charAt(k)-'0'; //String.valueOf是字符串类型 charAt()返回字符型 sum是int型所以自动转换为int型也就是它的ASCI码 这时候减去'0'就是其字符本身 } map.put(arr[i],sum); } //利用选择排序的思想,遍历所有键 先对数位之和进行比较 再对字面值进行比较 这样做的好处是 数位之和被比较过后再不会被重复比较 for (int i = 0; i < arr.length-1; i++) { for (int j = i+1; j < arr.length; j++) { //交换 if(map.get(arr[i])>map.get(arr[j])){ int temp=arr[i]; arr[i]=arr[j]; arr[j]=temp; }else if(map.get(arr[i])==(map.get(arr[j]))){ if(arr[i]>arr[j]){ int temp =arr[i]; arr[i]=arr[j]; arr[j]=temp; } } } } } }