上一个遍历的整数

第115场双周赛第一题,一开始考虑用栈,后来发现还不如直接用数组模拟

题目

给你一个下标从 0 开始的字符串数组 words ,其中 words[i] 要么是一个字符串形式的正整数,要么是字符串 "prev"

我们从数组的开头开始遍历,对于 words 中的每个 "prev" 字符串,找到 words 中的 上一个遍历的整数 ,定义如下:

  • k 表示到当前位置为止的连续 "prev" 字符串数目(包含当前字符串),令下标从 0 开始的 整数 数组 nums 表示目前为止遍历过的所有整数,同时用 nums_reverse 表示 nums 反转得到的数组,那么当前 "prev" 对应的 上一个遍历的整数nums_reverse 数组中下标为 (k - 1) 的整数。
  • 如果 k 比目前为止遍历过的整数数目 更多 ,那么上一个遍历的整数为 -1

请你返回一个整数数组,包含所有上一个遍历的整数。

示例 1:

1
2
3
4
5
6
输入:words = ["1","2","prev","prev","prev"]
输出:[2,1,-1]
解释:
对于下标为 2 处的 "prev" ,上一个遍历的整数是 2 ,因为连续 "prev" 数目为 1 ,同时在数组 reverse_nums 中,第一个元素是 2 。
对于下标为 3 处的 "prev" ,上一个遍历的整数是 1 ,因为连续 "prev" 数目为 2 ,同时在数组 reverse_nums 中,第二个元素是 1 。
对于下标为 4 处的 "prev" ,上一个遍历的整数是 -1 ,因为连续 "prev" 数目为 3 ,但总共只遍历过 2 个整数。

示例 2:

1
2
3
4
5
6
输入:words = ["1","prev","2","prev","prev"]
输出:[1,2,1]
解释:
对于下标为 1 处的 "prev" ,上一个遍历的整数是 1 。
对于下标为 3 处的 "prev" ,上一个遍历的整数是 2 。
对于下标为 4 处的 "prev" ,上一个遍历的整数是 1 ,因为连续 "prev" 数目为 2 ,同时在数组 reverse_nums 中,第二个元素是 1 。

提示:

  • 1 <= words.length <= 100
  • words[i] == "prev"1 <= int(words[i]) <= 100

解答

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
vector<int> lastVisitedIntegers(vector<string>& words) {
vector<int> record;
int countPre = 0;
vector<int>res;
for(auto str:words){
if(str!="prev"){
countPre = 0;
record.push_back(stoi(str));
}
else{
countPre++;
int size = record.size();
int index = size-countPre;
if(index>=0){
res.push_back(record[index]);
}
else res.push_back(-1);
}
}
return res;
}
};