Skip to content

Commit 3c35e90

Browse files
authored
feat: add solutions for lc No.2899 (#5050)
1 parent 828a71e commit 3c35e90

7 files changed

Lines changed: 201 additions & 147 deletions

File tree

solution/2800-2899/2899.Last Visited Integers/README.md

Lines changed: 71 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -82,47 +82,55 @@ tags:
8282

8383
### 方法一:模拟
8484

85-
我们直接根据题意模拟即可。在实现上,我们使用一个数组 $nums$ 来存储遍历过的整数,使用一个整数 $k$ 来记录当前连续的 $prev$ 字符串数目。如果当前字符串是 $prev$,那么我们就从 $nums$ 中取出第 $|nums| - k$ 个整数,如果不存在,那么就返回 $-1$。
85+
我们直接根据题意模拟即可。
8686

87-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 $words$ 的长度。
87+
定义一个数组 $\textit{seen}$ 来存储我们看到的正整数,定义一个数组 $\textit{ans}$ 来存储答案。我们还需要一个变量 $k$ 来记录连续出现的 $-1$ 的数量。
88+
89+
我们遍历数组 $\textit{nums}$:
90+
91+
- 如果当前元素 $x = -1$,我们将 $k$ 加 1。如果 $k$ 大于 $\textit{seen}$ 的长度,我们在 $\textit{ans}$ 中添加 $-1$;否则,我们在 $\textit{ans}$ 中添加 $\textit{seen}$ 的倒数第 $k$ 个元素。
92+
- 如果当前元素 $x$ 是一个正整数,我们将 $k$ 重置为 0,并将 $x$ 添加到 $\textit{seen}$ 的末尾。
93+
94+
时间复杂度 $O(n)$,空间复杂度 $O(n)$,其中 $n$ 是数组 $\textit{nums}$ 的长度。
8895

8996
<!-- tabs:start -->
9097

9198
#### Python3
9299

93100
```python
94101
class Solution:
95-
def lastVisitedIntegers(self, words: List[str]) -> List[int]:
96-
nums = []
102+
def lastVisitedIntegers(self, nums: List[int]) -> List[int]:
103+
seen = []
97104
ans = []
98105
k = 0
99-
for w in words:
100-
if w == "prev":
106+
for x in nums:
107+
if x == -1:
101108
k += 1
102-
i = len(nums) - k
103-
ans.append(-1 if i < 0 else nums[i])
109+
ans.append(-1 if k > len(seen) else seen[-k])
104110
else:
105111
k = 0
106-
nums.append(int(w))
112+
seen.append(x)
107113
return ans
108114
```
109115

110116
#### Java
111117

112118
```java
113119
class Solution {
114-
public List<Integer> lastVisitedIntegers(List<String> words) {
115-
List<Integer> nums = new ArrayList<>();
120+
public List<Integer> lastVisitedIntegers(int[] nums) {
121+
List<Integer> seen = new ArrayList<>();
116122
List<Integer> ans = new ArrayList<>();
117123
int k = 0;
118-
for (var w : words) {
119-
if ("prev".equals(w)) {
120-
++k;
121-
int i = nums.size() - k;
122-
ans.add(i < 0 ? -1 : nums.get(i));
124+
for (int x : nums) {
125+
if (x == -1) {
126+
if (++k > seen.size()) {
127+
ans.add(-1);
128+
} else {
129+
ans.add(seen.get(seen.size() - k));
130+
}
123131
} else {
124132
k = 0;
125-
nums.add(Integer.valueOf(w));
133+
seen.add(x);
126134
}
127135
}
128136
return ans;
@@ -135,20 +143,24 @@ class Solution {
135143
```cpp
136144
class Solution {
137145
public:
138-
vector<int> lastVisitedIntegers(vector<string>& words) {
139-
vector<int> nums;
146+
vector<int> lastVisitedIntegers(vector<int>& nums) {
147+
vector<int> seen;
140148
vector<int> ans;
141149
int k = 0;
142-
for (auto& w : words) {
143-
if (w == "prev") {
144-
++k;
145-
int i = nums.size() - k;
146-
ans.push_back(i < 0 ? -1 : nums[i]);
150+
151+
for (int x : nums) {
152+
if (x == -1) {
153+
if (++k > seen.size()) {
154+
ans.push_back(-1);
155+
} else {
156+
ans.push_back(seen[seen.size() - k]);
157+
}
147158
} else {
148159
k = 0;
149-
nums.push_back(stoi(w));
160+
seen.push_back(x);
150161
}
151162
}
163+
152164
return ans;
153165
}
154166
};
@@ -157,45 +169,50 @@ public:
157169
#### Go
158170

159171
```go
160-
func lastVisitedIntegers(words []string) (ans []int) {
161-
nums := []int{}
172+
func lastVisitedIntegers(nums []int) []int {
173+
seen := []int{}
174+
ans := []int{}
162175
k := 0
163-
for _, w := range words {
164-
if w == "prev" {
176+
177+
for _, x := range nums {
178+
if x == -1 {
165179
k++
166-
i := len(nums) - k
167-
if i < 0 {
180+
if k > len(seen) {
168181
ans = append(ans, -1)
169182
} else {
170-
ans = append(ans, nums[i])
183+
ans = append(ans, seen[len(seen)-k])
171184
}
172185
} else {
173186
k = 0
174-
x, _ := strconv.Atoi(w)
175-
nums = append(nums, x)
187+
seen = append(seen, x)
176188
}
177189
}
178-
return
190+
191+
return ans
179192
}
180193
```
181194

182195
#### TypeScript
183196

184197
```ts
185-
function lastVisitedIntegers(words: string[]): number[] {
186-
const nums: number[] = [];
198+
function lastVisitedIntegers(nums: number[]): number[] {
199+
const seen: number[] = [];
187200
const ans: number[] = [];
188201
let k = 0;
189-
for (const w of words) {
190-
if (w === 'prev') {
191-
++k;
192-
const i = nums.length - k;
193-
ans.push(i < 0 ? -1 : nums[i]);
202+
203+
for (const x of nums) {
204+
if (x === -1) {
205+
if (++k > seen.length) {
206+
ans.push(-1);
207+
} else {
208+
ans.push(seen.at(-k)!);
209+
}
194210
} else {
195211
k = 0;
196-
nums.push(+w);
212+
seen.push(x);
197213
}
198214
}
215+
199216
return ans;
200217
}
201218
```
@@ -204,19 +221,22 @@ function lastVisitedIntegers(words: string[]): number[] {
204221

205222
```rust
206223
impl Solution {
207-
pub fn last_visited_integers(words: Vec<String>) -> Vec<i32> {
208-
let mut nums: Vec<i32> = Vec::new();
224+
pub fn last_visited_integers(nums: Vec<i32>) -> Vec<i32> {
225+
let mut seen: Vec<i32> = Vec::new();
209226
let mut ans: Vec<i32> = Vec::new();
210-
let mut k = 0;
227+
let mut k: i32 = 0;
211228

212-
for w in words {
213-
if w == "prev" {
229+
for x in nums {
230+
if x == -1 {
214231
k += 1;
215-
let i = (nums.len() as i32) - k;
216-
ans.push(if i < 0 { -1 } else { nums[i as usize] });
232+
if k as usize > seen.len() {
233+
ans.push(-1);
234+
} else {
235+
ans.push(seen[seen.len() - k as usize]);
236+
}
217237
} else {
218238
k = 0;
219-
nums.push(w.parse::<i32>().unwrap());
239+
seen.push(x);
220240
}
221241
}
222242

0 commit comments

Comments
 (0)