给你一个下标从 0 开始的字符串数组 words
,其中 words[i]
要么是一个字符串形式的正整数,要么是字符串 "prev"
。
我们从数组的开头开始遍历,对于 words
中的每个 "prev"
字符串,找到 words
中的 上一个遍历的整数 ,定义如下:
k
表示到当前位置为止的连续"prev"
字符串数目(包含当前字符串),令下标从 0 开始的 整数 数组nums
表示目前为止遍历过的所有整数,同时用nums_reverse
表示nums
反转得到的数组,那么当前"prev"
对应的 上一个遍历的整数 是nums_reverse
数组中下标为(k - 1)
的整数。- 如果
k
比目前为止遍历过的整数数目 更多 ,那么上一个遍历的整数为-1
。
请你返回一个整数数组,包含所有上一个遍历的整数。
示例 1:
输入: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:
输入: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
方法一:模拟
我们直接根据题意模拟即可。在实现上,我们使用一个数组
时间复杂度
class Solution:
def lastVisitedIntegers(self, words: List[str]) -> List[int]:
nums = []
ans = []
k = 0
for w in words:
if w == "prev":
k += 1
i = len(nums) - k
ans.append(-1 if i < 0 else nums[i])
else:
k = 0
nums.append(int(w))
return ans
class Solution {
public List<Integer> lastVisitedIntegers(List<String> words) {
List<Integer> nums = new ArrayList<>();
List<Integer> ans = new ArrayList<>();
int k = 0;
for (var w : words) {
if ("prev".equals(w)) {
++k;
int i = nums.size() - k;
ans.add(i < 0 ? -1 : nums.get(i));
} else {
k = 0;
nums.add(Integer.valueOf(w));
}
}
return ans;
}
}
class Solution {
public:
vector<int> lastVisitedIntegers(vector<string>& words) {
vector<int> nums;
vector<int> ans;
int k = 0;
for (auto& w : words) {
if (w == "prev") {
++k;
int i = nums.size() - k;
ans.push_back(i < 0 ? -1 : nums[i]);
} else {
k = 0;
nums.push_back(stoi(w));
}
}
return ans;
}
};
func lastVisitedIntegers(words []string) (ans []int) {
nums := []int{}
k := 0
for _, w := range words {
if w == "prev" {
k++
i := len(nums) - k
if i < 0 {
ans = append(ans, -1)
} else {
ans = append(ans, nums[i])
}
} else {
k = 0
x, _ := strconv.Atoi(w)
nums = append(nums, x)
}
}
return
}
function lastVisitedIntegers(words: string[]): number[] {
const nums: number[] = [];
const ans: number[] = [];
let k = 0;
for (const w of words) {
if (w === 'prev') {
++k;
const i = nums.length - k;
ans.push(i < 0 ? -1 : nums[i]);
} else {
k = 0;
nums.push(+w);
}
}
return ans;
}
impl Solution {
pub fn last_visited_integers(words: Vec<String>) -> Vec<i32> {
let mut nums: Vec<i32> = Vec::new();
let mut ans: Vec<i32> = Vec::new();
let mut k = 0;
for w in words {
if w == "prev" {
k += 1;
let i = nums.len() as i32 - k;
ans.push(if i < 0 { -1 } else { nums[i as usize] });
} else {
k = 0;
nums.push(w.parse::<i32>().unwrap());
}
}
ans
}
}