Welcome to Subscribe On Youtube
2899. Last Visited Integers
Description
Given a 0-indexed array of strings words
where words[i]
is either a positive integer represented as a string or the string "prev"
.
Start iterating from the beginning of the array; for every "prev"
string seen in words
, find the last visited integer in words
which is defined as follows:
- Let
k
be the number of consecutive"prev"
strings seen so far (containing the current string). Letnums
be the 0-indexed array of integers seen so far andnums_reverse
be the reverse ofnums
, then the integer at(k - 1)th
index ofnums_reverse
will be the last visited integer for this"prev"
. - If
k
is greater than the total visited integers, then the last visited integer will be-1
.
Return an integer array containing the last visited integers.
Example 1:
Input: words = ["1","2","prev","prev","prev"] Output: [2,1,-1] Explanation: For "prev" at index = 2, last visited integer will be 2 as here the number of consecutive "prev" strings is 1, and in the array reverse_nums, 2 will be the first element. For "prev" at index = 3, last visited integer will be 1 as there are a total of two consecutive "prev" strings including this "prev" which are visited, and 1 is the second last visited integer. For "prev" at index = 4, last visited integer will be -1 as there are a total of three consecutive "prev" strings including this "prev" which are visited, but the total number of integers visited is two.
Example 2:
Input: words = ["1","prev","2","prev","prev"] Output: [1,2,1] Explanation: For "prev" at index = 1, last visited integer will be 1. For "prev" at index = 3, last visited integer will be 2. For "prev" at index = 4, last visited integer will be 1 as there are a total of two consecutive "prev" strings including this "prev" which are visited, and 1 is the second last visited integer.
Constraints:
1 <= words.length <= 100
words[i] == "prev"
or1 <= int(words[i]) <= 100
Solutions
Solution 1: Simulation
We can directly simulate according to the problem statement. In the implementation, we use an array $nums$ to store the traversed integers, and an integer $k$ to record the current number of consecutive $prev$ strings. If the current string is $prev$, we take out the $ | nums | - k-th$ integer from $nums$. If it does not exist, we return $-1$. |
The time complexity is $O(n)$, where $n$ is the length of the array $words$. The space complexity is $O(n)$.
-
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; } };
-
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
-
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 } }