数位排序-蓝桥杯-2022

简介: 利用HashMap该数据结构的特点,因为1到n不会有重复,而且把它做为键

题目

image.png

思路

利用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;
                        }
                    }
                }
            }
        }
}
相关文章
蓝桥杯:桶排序 与 例题:算式问题
蓝桥杯:桶排序 与 例题:算式问题
95 0
|
7月前
|
存储
力扣-2904最短且字典序最小的美丽子序列
力扣-2904最短且字典序最小的美丽子序列
45 1
|
8月前
|
C语言
大衍数列(蓝桥杯)
大衍数列(蓝桥杯)
|
8月前
|
Java
每日一题《剑指offer》数组篇之旋转数组的最小数字
每日一题《剑指offer》数组篇之旋转数组的最小数字
47 0
每日一题《剑指offer》数组篇之旋转数组的最小数字
|
存储 算法 测试技术
【AcWing每日一题】4653. 数位排序
【AcWing每日一题】4653. 数位排序
126 0
|
人工智能 算法 测试技术
【AcWing每日一题】4655. 重新排序
【AcWing每日一题】4655. 重新排序
65 0
|
人工智能 移动开发 机器人
蓝桥杯AcWing 题目题解 - 二分与前缀和、差分
蓝桥杯AcWing 题目题解 - 二分与前缀和、差分
185 0
|
测试技术
【寒假每日一题】AcWing 4653. 数位排序(补)
目录 一、题目 1、原题链接 2、题目描述 二、解题报告 1、思路分析 2、时间复杂度 3、代码详解 三、知识风暴 关于pair
111 0
【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学
思路:将问题**“第n个神奇数是x”转化为“小于等于x的神奇数有n个”**,由于x越大n一定越大,因此可以使用二分法查找一个神奇数小于等于n的区间(0,right],最后返回右边界
214 0
【每日一题Day35】LC878第N个神奇数字 | 二分查找 找规律 + 数学