### 华为OD机试真题及答案解析
以下是一些典型的华为OD机试题目及其解析,涵盖不同类型的算法和逻辑问题。这些问题基于引用内容以及常见的机试考点进行整理。
---
#### 1. **TLV解析**
TLV(Type-Length-Value)是一种数据编码格式,常用于网络协议中。在华为OD机试中,可能会要求实现TLV解析功能。
**题目描述**
给定一个字符串表示的TLV序列,解析出其中的所有字段,并输出解析结果。每个字段由Type、Length和Value三部分组成[^1]。
**代码示例**
```go
package main
import (
"fmt"
)
func tlvParse(data []byte) [][]byte {
var result [][]byte
for len(data) > 0 {
if len(data) < 3 {
break
}
t := data[0]
l := int(data[1])
if len(data) < 2+l {
break
}
v := data[2 : 2+l]
result = append(result, v)
data = data[2+l:]
}
return result
}
func main() {
data := []byte{1, 5, 'H', 'e', 'l', 'l', 'o', 2, 3, 'G', 'o', '!' }
parsed := tlvParse(data)
for _, v := range parsed {
fmt.Println(string(v))
}
}
```
---
#### 2. **最大报酬问题**
这是一个经典的动态规划问题,通常以“最大报酬”形式出现。
**题目描述**
给定一系列工作,每份工作有对应的时长和报酬。在总时长限制T内,选择一些工作使得总报酬最大化[^2]。
**代码示例**
```python
def max_reward(jobs, T):
dp = [0] * (T + 1)
for job in jobs:
time, reward = job
for t in range(T, time - 1, -1):
dp[t] = max(dp[t], dp[t - time] + reward)
return dp[T]
# 示例输入
jobs = [(2, 50), (3, 70), (4, 90)]
T = 5
print(max_reward(jobs, T)) # 输出:120
```
---
#### 3. **数大雁问题**
该问题要求统计字符串中“quack”叫声的数量。
**题目描述**
给定一个字符串,只包含字符‘q’, ‘u’, ‘a’, ‘c’, ‘k’,统计其中完整的“quack”叫声数量[^3]。
**代码示例**
```python
def count_quack(s):
pattern = "quack"
count = [0] * 5
result = 0
for c in s:
if c == 'q':
if count[4] > 0:
count[4] -= 1
result += 1
count[0] += 1
elif c in pattern:
idx = pattern.index(c)
if count[idx - 1] > 0:
count[idx - 1] -= 1
count[idx] += 1
if any(count[:4]):
return -1
return result
# 示例输入
s = "quackquack"
print(count_quack(s)) # 输出:2
```
---
#### 4. **补种未成活胡杨**
该问题涉及数组操作和贪心算法。
**题目描述**
给定N棵胡杨树的状态,其中有M棵未成活,最多可以补种K棵胡杨树。计算最终存活的胡杨树数量[^4]。
**代码示例**
```python
def resupply_resurrection_trees(N, M, deadTrees, K):
deadTrees = set(deadTrees)
res = N - M
for i in range(1, N + 1):
if i in deadTrees and K > 0:
res += 1
K -= 1
return res
# 示例输入
N, M, K = 5, 2, 1
deadTrees = [2, 4]
print(resupply_resurrection_trees(N, M, deadTrees, K)) # 输出:4
```
---
###