3522. 执行指令后的得分
题目描述
给你两个数组:instructions 和 values,数组的长度均为 n。
你需要根据以下规则模拟一个过程:
- 从下标 
i = 0的第一个指令开始,初始得分为 0。 - 如果 
instructions[i]是"add":- 将 
values[i]加到你的得分中。 - 移动到下一个指令 
(i + 1)。 
 - 将 
 - 如果 
instructions[i]是"jump":- 移动到下标为 
(i + values[i])的指令,但不修改你的得分。 
 - 移动到下标为 
 
当以下任一情况发生时,过程会终止:
- 越界(即 
i < 0或i >= n),或 - 尝试再次执行已经执行过的指令。被重复访问的指令不会再次执行。
 
返回过程结束时的得分。
示例 1:
输入: instructions = ["jump","add","add","jump","add","jump"], values = [2,1,3,1,-2,-3]
输出: 1
解释:
从下标 0 开始模拟过程:
- 下标 0:指令是 
"jump",移动到下标0 + 2 = 2。 - 下标 2:指令是 
"add",将values[2] = 3加到得分中,移动到下标 3。得分变为 3。 - 下标 3:指令是 
"jump",移动到下标3 + 1 = 4。 - 下标 4:指令是 
"add",将values[4] = -2加到得分中,移动到下标 5。得分变为 1。 - 下标 5:指令是 
"jump",移动到下标5 + (-3) = 2。 - 下标 2:已经访问过。过程结束。
 
示例 2:
输入: instructions = ["jump","add","add"], values = [3,1,1]
输出: 0
解释:
从下标 0 开始模拟过程:
- 下标 0:指令是 
"jump",移动到下标0 + 3 = 3。 - 下标 3:越界。过程结束。
 
示例 3:
输入: instructions = ["jump"], values = [0]
输出: 0
解释:
从下标 0 开始模拟过程:
- 下标 0:指令是 
"jump",移动到下标0 + 0 = 0。 - 下标 0:已经访问过。过程结束。
 
提示:
n == instructions.length == values.length1 <= n <= 105instructions[i]只能是"add"或"jump"。-105 <= values[i] <= 105
解法
方法一:模拟
我们根据题意模拟即可。
我们定义一个长度为 \(n\) 的布尔数组 \(\textit{vis}\),用于记录每一条指令是否被执行过,初始时均为 \(\text{false}\)。
然后我们从下标 \(i = 0\) 开始,循环执行以下操作:
- 将 \(\textit{vis}[i]\) 置为 \(\text{true}\);
 - 如果 \(\textit{instructions}[i]\) 的第一个字符为 'a',那么我们将答案增加 \(\textit{value}[i]\),然后 \(i\) 加 \(1\);否则,我们将 \(i\) 增加 \(\textit{value}[i]\)。
 
循环,直至 \(i \lt 0\) 或者 \(i \ge n\),或者 \(\textit{vis}[i]\) 为 \(\text{true}\)。
最后返回答案即可。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。其中 \(n\) 是数组 \(\textit{value}\) 的长度。
1 2 3 4 5 6 7 8 9 10 11 12 13  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15  |  | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18  |  |