2025-10-09:执行指令后的得分。用go语言,输入两个长度相同的数组:instructions(每项为 “add“ 或 “

举报
福大大架构师每日一题 发表于 2025/10/09 06:39:52 2025/10/09
【摘要】 2025-10-09:执行指令后的得分。用go语言,输入两个长度相同的数组:instructions(每项为 “add” 或 “jump”)和 values。按下面的规则模拟执行并返回结束时的得分:初始位置 i = 0,得分 score = 0。若当前指令为 “add”:把 values[i] 累加到 score,然后将 i 增加 1,执行下一条指令。若当前指令为 “jump”:不改变 sc...

2025-10-09:执行指令后的得分。用go语言,输入两个长度相同的数组:instructions(每项为 “add” 或 “jump”)和 values。

按下面的规则模拟执行并返回结束时的得分:

  • 初始位置 i = 0,得分 score = 0。

  • 若当前指令为 “add”:把 values[i] 累加到 score,然后将 i 增加 1,执行下一条指令。

  • 若当前指令为 “jump”:不改变 score,直接把 i 改为 i + values[i]。(即跳转到该索引处继续执行)

  • 当索引越界(i < 0 或 i >= n)或将要执行的指令已经在之前被执行过时,停止模拟(注意:重复访问的指令不再被执行)。

最终返回停止时的 score。

n == instructions.length == values.length。

1 <= n <= 100000。

instructions[i] 只能是 “add” 或 “jump”。

-100000 <= values[i] <= 100000。

输入: 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:已经访问过。过程结束。

题目来自力扣3522。

执行过程详细描述

初始状态:

  • 指令数组:[“jump”, “add”, “add”, “jump”, “add”, “jump”]
  • 值数组:[2, 1, 3, 1, -2, -3]
  • 当前位置:i = 0
  • 当前得分:score = 0
  • 访问标记:所有指令都未访问过

执行步骤:

第1步:位置0

  • 指令:“jump”(未访问过)
  • 标记位置0为已访问
  • 执行跳转:i = 0 + 2 = 2
  • 得分保持为0

第2步:位置2

  • 指令:“add”(未访问过)
  • 标记位置2为已访问
  • 执行加法:score = 0 + 3 = 3
  • 移动到下一条指令:i = 2 + 1 = 3

第3步:位置3

  • 指令:“jump”(未访问过)
  • 标记位置3为已访问
  • 执行跳转:i = 3 + 1 = 4
  • 得分保持为3

第4步:位置4

  • 指令:“add”(未访问过)
  • 标记位置4为已访问
  • 执行加法:score = 3 + (-2) = 1
  • 移动到下一条指令:i = 4 + 1 = 5

第5步:位置5

  • 指令:“jump”(未访问过)
  • 标记位置5为已访问
  • 执行跳转:i = 5 + (-3) = 2
  • 得分保持为1

第6步:位置2

  • 发现位置2的指令已经被标记为访问过
  • 停止模拟

最终结果:

  • 最终得分:1

复杂度分析

时间复杂度:O(n)

  • 每个指令最多被执行一次(一旦访问就会被标记)
  • 最坏情况下需要遍历所有n个指令
  • 每次操作都是常数时间

额外空间复杂度:O(1)

  • 算法在原地修改instructions数组来标记访问状态
  • 只使用了有限的几个变量(i, ans, n等)
  • 没有使用额外的数据结构来存储访问状态

关键点:
通过将已执行的指令设为空字符串来标记访问状态,既避免了重复执行,又不需要额外的空间来记录访问历史,这是该算法设计的巧妙之处。

Go完整代码如下:

package main

import (
	"fmt"
)

func calculateScore(instructions []string, values []int) (ans int64) {
	n := len(instructions)
	i := 0
	for 0 <= i && i < n && instructions[i] != "" {
		s := instructions[i]
		instructions[i] = ""
		if s[0] == 'a' {
			ans += int64(values[i])
			i++
		} else {
			i += values[i]
		}
	}
	return
}

func main() {
	instructions := []string{"jump", "add", "add", "jump", "add", "jump"}
	values := []int{2, 1, 3, 1, -2, -3}
	result := calculateScore(instructions, values)
	fmt.Println(result)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def calculate_score(instructions, values):
    n = len(instructions)
    i = 0
    ans = 0
    
    while 0 <= i < n and instructions[i] != "":
        s = instructions[i]
        instructions[i] = ""  # 标记为已访问
        if s[0] == 'a':  # 如果是 "add" 指令
            ans += values[i]
            i += 1
        else:  # 如果是 "jump" 指令
            i += values[i]
    
    return ans

def main():
    instructions = ["jump", "add", "add", "jump", "add", "jump"]
    values = [2, 1, 3, 1, -2, -3]
    result = calculate_score(instructions, values)
    print(result)

if __name__ == "__main__":
    main()

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。