【Leetcode字符串--字符串下标排序】6121.裁剪数字后查询第 K 小的数字

Leetcode 6121.裁剪数字后查询第 K 小的数字

1.问题描述

在这里插入图片描述

2.解决方案

解法一:string排序

错误算法,因为如果string相同,没法区分到底是哪个index

class Solution {
    public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
        int len = queries.length;
        int[] ans = new int[len];
        for(int i=0;i<len;i++){
            //第a小的string
            int a = queries[i][0];
            //最右边b个数位
            int b = queries[i][1];
            List<String> list = new ArrayList<>();
            HashMap<String, Integer> map = new HashMap<>();
            for(int j=0; j<nums.length; j++){
                String str = nums[j];
                String t = str.substring(str.length()-b,str.length());
                //如果两个裁剪后数字一样大,那么下标更小的数字视为更小的数字 所以后面的下标就不更新进去了
                if(!map.containsKey(t)) map.put(t, j);
                list.add(t);
            }
            //string排序
            Collections.sort(list, (str1, str2)->(str1.compareTo(str2)));
            //找第a小的string
            ans[i] = map.get(list.get(a-1));
        }
        return ans;
    }
}


解法二:string,index一起排序

题目是要求,找到第a小的String,并且认为index小的更小,所以直接搞一个Node存着String和index,然后先按String排序,后按index排序,就可以了。

属于Lambda表达式的多条件排序

//先按照string排序,后index排序(都是升序)
Collections.sort(list, (node1, node2)->{
    if(node1.str.equals(node2.str)){
        return node1.index - node2.index;
    }else{
        return node1.str.compareTo(node2.str);
    }
});
class Solution {
    class Node{
        public String str;
        public int index;
        Node(String s, int i){
            str = s;
            index = i;
        }
    }
    public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
        int len = queries.length;
        int[] ans = new int[len];
        for(int i=0;i<len;i++){
            //第a小的string
            int a = queries[i][0];
            //最右边b个数位
            int b = queries[i][1];
            //记录String和index 利用String和index排序
            List<Node> list = new ArrayList<>();
            for(int j=0; j<nums.length; j++){
                String str = nums[j];
                String t = str.substring(str.length()-b,str.length());
                list.add(new Node(t, j));
            }
            //先按照string排序,后index排序(都是升序)
            Collections.sort(list, (node1, node2)->{
                if(node1.str.equals(node2.str)){
                    return node1.index - node2.index;
                }else{
                    return node1.str.compareTo(node2.str);
                }
            });
            //找第a小的string的index
            ans[i] = list.get(a-1).index;
        }
        return ans;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值