算法简单模拟周赛上一个遍历的整数
Hoshea Zhang第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; } };
|