Skip to content

Commit 383a3a6

Browse files
committed
feat: add solutions to lc problem: No.2343
No.2343.Query Kth Smallest Trimmed Number
1 parent 72bd7c4 commit 383a3a6

File tree

7 files changed

+166
-56
lines changed

7 files changed

+166
-56
lines changed

solution/2300-2399/2342.Max Sum of a Pair With Equal Sum of Digits/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@
4747

4848
对于数组中的每个元素,计算其数位和,将其存入哈希表 $d$ 中,哈希表的键为数位和,值为数组中所有数位和为该键的元素组成的数组。
4949

50-
遍历哈希表 $d$,对于每个键值对,如果该键对应的数组长度大于 1,则对该数组进行降序排序,取前两个元素相加,更新答案。
50+
遍历哈希表 $d$,对于每个键值对,如果该键对应的数组长度大于 $1$,则对该数组进行降序排序,取前两个元素相加,更新答案。
5151

5252
最终返回答案。
5353

@@ -61,7 +61,7 @@
6161

6262
最终返回答案。
6363

64-
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 为数组 `nums` 的长度,而 $C$ 为数组 `nums` 中元素最大值的数位和。本题中 $C \leq 9 \times 10^8$,因此我们固定取 $C=100$。
64+
时间复杂度 $O(n)$,空间复杂度 $O(C)$。其中 $n$ 为数组 `nums` 的长度,而 $C$ 为数组 `nums` 的最大数位和。本题中 $nums[i] \leq 10^9$,因此我们固定取 $C=100$ 即可
6565

6666
<!-- tabs:start -->
6767

solution/2300-2399/2343.Query Kth Smallest Trimmed Number/README.md

Lines changed: 62 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,12 @@
7474

7575
<!-- 这里可写通用的实现逻辑 -->
7676

77+
**方法一:模拟**
78+
79+
根据题意,我们可以模拟裁剪过程,然后对裁剪后的字符串进行排序,最后根据下标找到对应的数字即可。
80+
81+
时间复杂度 $O(m \times \ n \times \log n \times s)$,空间复杂度 $O(n)$。其中 $m$ 和 $n$ 分别为 `nums``queries` 的长度,而 $s$ 为 $nums[i]$ 字符串的长度。
82+
7783
<!-- tabs:start -->
7884

7985
### **Python3**
@@ -86,13 +92,9 @@ class Solution:
8692
self, nums: List[str], queries: List[List[int]]
8793
) -> List[int]:
8894
ans = []
89-
for k, t in queries:
90-
x = nums[:]
91-
for i, v in enumerate(x):
92-
x[i] = v[-t:]
93-
p = list(zip(x, range(len(x))))
94-
p.sort(key=lambda v: (int(v[0]), v[1]))
95-
ans.append(p[k - 1][1])
95+
for k, trim in queries:
96+
t = sorted((v[-trim:], i) for i, v in enumerate(nums))
97+
ans.append(t[k - 1][1])
9698
return ans
9799
```
98100

@@ -103,24 +105,66 @@ class Solution:
103105
```java
104106
class Solution {
105107
public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
106-
int n = queries.length;
107-
int m = nums.length;
108-
int[] ans = new int[n];
109-
for (int i = 0; i < n; ++i) {
110-
int k = queries[i][0], t = queries[i][1];
111-
String[][] arr = new String[m][2];
112-
for (int j = 0; j < m; ++j) {
113-
arr[j][0] = nums[j].substring(nums[j].length() - t);
114-
arr[j][1] = String.valueOf(j);
108+
int n = nums.length;
109+
int m = queries.length;
110+
int[] ans = new int[m];
111+
String[][] t = new String[n][2];
112+
for (int i = 0; i < m; ++i) {
113+
int k = queries[i][0], trim = queries[i][1];
114+
for (int j = 0; j < n; ++j) {
115+
t[j] = new String[] {nums[j].substring(nums[j].length() - trim), String.valueOf(j)};
115116
}
116-
Arrays.sort(arr, (a, b) -> {
117+
Arrays.sort(t, (a, b) -> {
117118
int x = a[0].compareTo(b[0]);
118119
return x == 0 ? Long.compare(Integer.valueOf(a[1]), Integer.valueOf(b[1])) : x;
119120
});
120-
ans[i] = Integer.valueOf(arr[k - 1][1]);
121+
ans[i] = Integer.valueOf(t[k - 1][1]);
122+
}
123+
return ans;
124+
}
125+
}
126+
```
127+
128+
### **C++**
129+
130+
```cpp
131+
class Solution {
132+
public:
133+
vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
134+
int n = nums.size();
135+
vector<pair<string, int>> t(n);
136+
vector<int> ans;
137+
for (auto& q : queries) {
138+
int k = q[0], trim = q[1];
139+
for (int j = 0; j < n; ++j) {
140+
t[j] = {nums[j].substr(nums[j].size() - trim), j};
141+
}
142+
sort(t.begin(), t.end());
143+
ans.push_back(t[k - 1].second);
121144
}
122145
return ans;
123146
}
147+
};
148+
```
149+
150+
### **Go**
151+
152+
```go
153+
func smallestTrimmedNumbers(nums []string, queries [][]int) []int {
154+
type pair struct {
155+
s string
156+
i int
157+
}
158+
ans := make([]int, len(queries))
159+
t := make([]pair, len(nums))
160+
for i, q := range queries {
161+
for j, s := range nums {
162+
t[j] = pair{s[len(s)-q[1]:], j}
163+
}
164+
sort.Slice(t, func(i, j int) bool { a, b := t[i], t[j]; return a.s < b.s || a.s == b.s && a.i < b.i })
165+
ans[i] = t[q[0]-1].i
166+
}
167+
return ans
124168
}
125169
```
126170

solution/2300-2399/2343.Query Kth Smallest Trimmed Number/README_EN.md

Lines changed: 56 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,9 @@ class Solution:
7777
self, nums: List[str], queries: List[List[int]]
7878
) -> List[int]:
7979
ans = []
80-
for k, t in queries:
81-
x = nums[:]
82-
for i, v in enumerate(x):
83-
x[i] = v[-t:]
84-
p = list(zip(x, range(len(x))))
85-
p.sort(key=lambda v: (int(v[0]), v[1]))
86-
ans.append(p[k - 1][1])
80+
for k, trim in queries:
81+
t = sorted((v[-trim:], i) for i, v in enumerate(nums))
82+
ans.append(t[k - 1][1])
8783
return ans
8884
```
8985

@@ -92,27 +88,69 @@ class Solution:
9288
```java
9389
class Solution {
9490
public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
95-
int n = queries.length;
96-
int m = nums.length;
97-
int[] ans = new int[n];
98-
for (int i = 0; i < n; ++i) {
99-
int k = queries[i][0], t = queries[i][1];
100-
String[][] arr = new String[m][2];
101-
for (int j = 0; j < m; ++j) {
102-
arr[j][0] = nums[j].substring(nums[j].length() - t);
103-
arr[j][1] = String.valueOf(j);
91+
int n = nums.length;
92+
int m = queries.length;
93+
int[] ans = new int[m];
94+
String[][] t = new String[n][2];
95+
for (int i = 0; i < m; ++i) {
96+
int k = queries[i][0], trim = queries[i][1];
97+
for (int j = 0; j < n; ++j) {
98+
t[j] = new String[] {nums[j].substring(nums[j].length() - trim), String.valueOf(j)};
10499
}
105-
Arrays.sort(arr, (a, b) -> {
100+
Arrays.sort(t, (a, b) -> {
106101
int x = a[0].compareTo(b[0]);
107102
return x == 0 ? Long.compare(Integer.valueOf(a[1]), Integer.valueOf(b[1])) : x;
108103
});
109-
ans[i] = Integer.valueOf(arr[k - 1][1]);
104+
ans[i] = Integer.valueOf(t[k - 1][1]);
110105
}
111106
return ans;
112107
}
113108
}
114109
```
115110

111+
### **C++**
112+
113+
```cpp
114+
class Solution {
115+
public:
116+
vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
117+
int n = nums.size();
118+
vector<pair<string, int>> t(n);
119+
vector<int> ans;
120+
for (auto& q : queries) {
121+
int k = q[0], trim = q[1];
122+
for (int j = 0; j < n; ++j) {
123+
t[j] = {nums[j].substr(nums[j].size() - trim), j};
124+
}
125+
sort(t.begin(), t.end());
126+
ans.push_back(t[k - 1].second);
127+
}
128+
return ans;
129+
}
130+
};
131+
```
132+
133+
### **Go**
134+
135+
```go
136+
func smallestTrimmedNumbers(nums []string, queries [][]int) []int {
137+
type pair struct {
138+
s string
139+
i int
140+
}
141+
ans := make([]int, len(queries))
142+
t := make([]pair, len(nums))
143+
for i, q := range queries {
144+
for j, s := range nums {
145+
t[j] = pair{s[len(s)-q[1]:], j}
146+
}
147+
sort.Slice(t, func(i, j int) bool { a, b := t[i], t[j]; return a.s < b.s || a.s == b.s && a.i < b.i })
148+
ans[i] = t[q[0]-1].i
149+
}
150+
return ans
151+
}
152+
```
153+
116154
### **TypeScript**
117155

118156
```ts
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
class Solution {
2+
public:
3+
vector<int> smallestTrimmedNumbers(vector<string>& nums, vector<vector<int>>& queries) {
4+
int n = nums.size();
5+
vector<pair<string, int>> t(n);
6+
vector<int> ans;
7+
for (auto& q : queries) {
8+
int k = q[0], trim = q[1];
9+
for (int j = 0; j < n; ++j) {
10+
t[j] = {nums[j].substr(nums[j].size() - trim), j};
11+
}
12+
sort(t.begin(), t.end());
13+
ans.push_back(t[k - 1].second);
14+
}
15+
return ans;
16+
}
17+
};
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
func smallestTrimmedNumbers(nums []string, queries [][]int) []int {
2+
type pair struct {
3+
s string
4+
i int
5+
}
6+
ans := make([]int, len(queries))
7+
t := make([]pair, len(nums))
8+
for i, q := range queries {
9+
for j, s := range nums {
10+
t[j] = pair{s[len(s)-q[1]:], j}
11+
}
12+
sort.Slice(t, func(i, j int) bool { a, b := t[i], t[j]; return a.s < b.s || a.s == b.s && a.i < b.i })
13+
ans[i] = t[q[0]-1].i
14+
}
15+
return ans
16+
}

solution/2300-2399/2343.Query Kth Smallest Trimmed Number/Solution.java

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
11
class Solution {
22
public int[] smallestTrimmedNumbers(String[] nums, int[][] queries) {
3-
int n = queries.length;
4-
int m = nums.length;
5-
int[] ans = new int[n];
6-
for (int i = 0; i < n; ++i) {
7-
int k = queries[i][0], t = queries[i][1];
8-
String[][] arr = new String[m][2];
9-
for (int j = 0; j < m; ++j) {
10-
arr[j][0] = nums[j].substring(nums[j].length() - t);
11-
arr[j][1] = String.valueOf(j);
3+
int n = nums.length;
4+
int m = queries.length;
5+
int[] ans = new int[m];
6+
String[][] t = new String[n][2];
7+
for (int i = 0; i < m; ++i) {
8+
int k = queries[i][0], trim = queries[i][1];
9+
for (int j = 0; j < n; ++j) {
10+
t[j] = new String[] {nums[j].substring(nums[j].length() - trim), String.valueOf(j)};
1211
}
13-
Arrays.sort(arr, (a, b) -> {
12+
Arrays.sort(t, (a, b) -> {
1413
int x = a[0].compareTo(b[0]);
1514
return x == 0 ? Long.compare(Integer.valueOf(a[1]), Integer.valueOf(b[1])) : x;
1615
});
17-
ans[i] = Integer.valueOf(arr[k - 1][1]);
16+
ans[i] = Integer.valueOf(t[k - 1][1]);
1817
}
1918
return ans;
2019
}

solution/2300-2399/2343.Query Kth Smallest Trimmed Number/Solution.py

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,7 @@ def smallestTrimmedNumbers(
33
self, nums: List[str], queries: List[List[int]]
44
) -> List[int]:
55
ans = []
6-
for k, t in queries:
7-
x = nums[:]
8-
for i, v in enumerate(x):
9-
x[i] = v[-t:]
10-
p = list(zip(x, range(len(x))))
11-
p.sort(key=lambda v: (int(v[0]), v[1]))
12-
ans.append(p[k - 1][1])
6+
for k, trim in queries:
7+
t = sorted((v[-trim:], i) for i, v in enumerate(nums))
8+
ans.append(t[k - 1][1])
139
return ans

0 commit comments

Comments
 (0)