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;
}
}