Post

迅雷笔试题目

迅雷笔试题目

记录一下迅雷笔试,都比较简单

第一题

螺旋矩阵生成

输入

一个正整数n

输出

一个n行n列的螺旋矩阵

样例

1
2
3
4
5
6
输入:
3
输出:
1 2 3
8 9 4
7 6 5

思路

模拟即可,注意细节

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
package main

import "fmt"

// 生成一个n×n的螺旋矩阵
func generateSpiralMatrix(n int) [][]int {
	// 初始化一个n×n的零矩阵
	matrix := make([][]int, n)
	for i := range matrix {
		matrix[i] = make([]int, n)
	}

	// 定义方向:右、下、左、上
	right := []int{0, 1}
	down := []int{1, 0}
	left := []int{0, -1}
	up := []int{-1, 0}

	directions := [][]int{right, down, left, up}
	directions := [][]int{{0,1},{1,0},{0,-1},{-1,0}}
	directionIdx := 0

	row, col := 0, 0 // 起始位置
	num := 1         // 从1开始填充

	for i := 0; i < n*n; i++ {
		matrix[row][col] = num
		num++

		// 计算下一个位置
		nextRow := row + directions[directionIdx][0]
		nextCol := col + directions[directionIdx][1]

		// 检查是否需要改变方向
		if nextRow < 0 || nextRow >= n || nextCol < 0 || nextCol >= n || matrix[nextRow][nextCol] != 0 {
			// 改变方向,直接省去了很多代码
			directionIdx = (directionIdx + 1) % 4
			nextRow = row + directions[directionIdx][0]
			nextCol = col + directions[directionIdx][1]
		}

		row, col = nextRow, nextCol
	}

	return matrix
}

// 打印矩阵
func printMatrix(matrix [][]int) {
	for _, row := range matrix {
		fmt.Println(row)
	}
}

func main() {
	// 生成并打印3×3的螺旋矩阵
	n := 3
	spiral := generateSpiralMatrix(n)
	fmt.Printf("%d×%d的螺旋矩阵:\n", n, n)
	printMatrix(spiral)

	// 生成并打印4×4的螺旋矩阵
	n = 4
	spiral = generateSpiralMatrix(n)
	fmt.Printf("\n%d×%d的螺旋矩阵:\n", n, n)
	printMatrix(spiral)
}

第二题

字符串数字相加减

给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。 输入格式:两个非负整数的字符串,用空格隔开输出格式:结果数值的字符串 提示: 1 <= num1.length,num2.ength <= 200 num1 和 num2 只能由数字组成。 num1 和 num2 都不包含任何前导零,除了数字0本身,

输入

两个数字

输出

两个数字的乘积

样例

1
2
3
4
输入:
123 456
输出:
56088

代码

直接模拟即可,使用单个位置输出就好了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
package main
import "fmt"
import "strconv"


func main() {
	var num1, num2 string
	
	// 使用fmt.Scan读取两个数字
	fmt.Scan(&num1, &num2)
	
	// 计算乘积
	result := multiply(num1, num2)
	
	// 输出结果
	fmt.Println(result)
}

func multiply(num1 string, num2 string) string {
	// 处理特殊情况
	if num1 == "0" || num2 == "0" {
		return "0"
	}
	
	// 初始化结果数组,最大长度为 num1.length + num2.length
	result := make([]int, len(num1)+len(num2))
	
	// 从右往左遍历 num1
	for i := len(num1) - 1; i >= 0; i-- {
		// 从右往左遍历 num2
		for j := len(num2) - 1; j >= 0; j-- {
			// 计算当前位的乘积
			mul := int(num1[i]-'0') * int(num2[j]-'0')
			// 计算当前乘积在结果数组中的位置
			p1 := i + j
			p2 := i + j + 1  // 进位
			// 累加到结果数组
			sum := mul + result[p2]
			
			result[p1] += sum / 10
			result[p2] = sum % 10
		}
	}
	
	// 构建结果字符串
	var sb strings.Builder
	// 跳过前导零
	i := 0
	for i < len(result) && result[i] == 0 {
		i++
	}
	// 转换为字符串
	for ; i < len(result); i++ {
		sb.WriteByte(byte(result[i] + '0'))
	}
	
	if sb.Len() == 0 {
		return "0"
	}
	return sb.String()
}

第三题

在网络传输中,SDN(软件定义网络)需要动态调整路由策略以优化传输效率。假 设数据包从 源节点到目标节点有多条路径可选,每条路径的带宽占用和传输延迟不同。现需在 总带宽消耗 不超过阈值的前提下,找到延迟最小的路径。

输入

给定一个带权有向图,包含 N 个节点和 M 条边。每条边e有三个属性:起点 u、终点 v 带宽消耗 b和延迟 d。要求从源节点$ 到目标节点T的路径,使得路径上所有边 的带宽消耗总和不超过 B,且总延迟最小。若不存在合法路径,返回-1。

输出

最小延迟值

样例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
输入:
输入格式:
N M S T
u1 v1 b1 d1
u2 v2 b2 d2
B

示例输入
3 3 0 2
0 1 2 3
0 2 5 10
1 2 2 4
5

输出:
7

思路

使用dijkstra算法,但是需要修改一下,因为需要考虑带宽的限制,就多加一个贷款条件下的最小延迟。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
import heapq

def solve():
    line1 = input().split()
    n = int(line1[0])
    m = int(line1[1])
    start_node = int(line1[2])
    end_node = int(line1[3])

    edges = []
    for _ in range(m):
        line = input().split()
        u = int(line[0])
        v = int(line[1])
        b = int(line[2])
        d = int(line[3])
        edges.append((u, v, b, d))

    max_bandwidth = int(input())

    adj = [[] for _ in range(n + 1)]
    for u, v, b, d in edges:
        adj[u].append((v, b, d))

    min_delay = {}  # (node, bandwidth) -> min_delay
    pq = [(0, 0, start_node)]  # (delay, bandwidth, node)

    while pq:
        delay, bandwidth, u = heapq.heappop(pq)

        if (u, bandwidth) in min_delay and min_delay[(u, bandwidth)] <= delay:
            continue
        min_delay[(u, bandwidth)] = delay  # 存入,满足要求贷款下的延迟

        if u == end_node:
            continue

        for v, b, d in adj[u]:
            new_bandwidth = bandwidth + b
            new_delay = delay + d
            if new_bandwidth <= max_bandwidth:
                heapq.heappush(pq, (new_delay, new_bandwidth, v))

    result = float('inf')
    found_path = False
    for bandwidth in range(max_bandwidth + 1):
        if (end_node, bandwidth) in min_delay:
            result = min(result, min_delay[(end_node, bandwidth)])
            found_path = True

    if found_path:
        print(result)
    else:
        print(-1)

if __name__ == "__main__":
    solve()
This post is licensed under CC BY 4.0 by the author.