@@ -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
94101class 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
113119class 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
136144class Solution {
137145public:
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
206223impl 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