【2024年华为OD机试】 (C卷,200分)- 反射计数(Java JS PythonC/C++)
一、问题描述
题目解析
题目描述
给定一个包含 0
和 1
的二维矩阵,一个物体从给定的初始位置出发,在给定的速度下进行移动。遇到矩阵的边缘时会发生镜面反射。无论物体经过 0
还是 1
,都不影响其速度。请计算并给出经过 t
时间单位后,物体经过 1
点的次数。
输入描述
-
第一行为初始信息:
<w> <h> <x> <y> <sx> <sy> <t>
w
和h
为矩阵的宽和高。x
和y
为起始位置。sx
和sy
为初始速度。t
为经过的时间。
-
第二行开始一共
h
行,为二维矩阵信息。
输出描述
输出经过 1
的个数。注意初始位置也要计算在内。
用例
输入
12 7 2 1 1 -1 13
001000010000
001000010000
001000010000
001000010000
001000010000
001000010000
001000010000
输出
3
说明
- 初始位置为
(2, 1)
,速度为(1, -1)
。 - 经过 13 个时间单位后,物体经过
1
的个数为3
。
题目解析
问题分析
-
目标
计算物体在t
时间单位内经过1
的点的次数。 -
关键点
- 物体在矩阵中移动,遇到边缘时会发生镜面反射。
- 每次移动的时间单位为
1
,不考虑小于1
个时间单位内经过的点。 - 初始位置如果是
1
,也要计算在内。
-
问题转化
模拟物体在矩阵中的移动过程,记录经过1
的点的次数。
解题思路
-
初始化
- 读取矩阵的宽
w
和高h
。 - 读取初始位置
(x, y)
和速度(sx, sy)
。 - 读取时间
t
。 - 读取矩阵数据。
- 读取矩阵的宽
-
模拟移动过程
- 对于每个时间单位,更新物体的位置。
- 如果位置超出矩阵边界,则进行镜面反射,并调整速度方向。
- 检查当前位置是否为
1
,如果是,则计数加1
。
-
输出结果
- 输出经过
1
的点的次数。
- 输出经过
示例分析
输入
12 7 2 1 1 -1 13
001000010000
001000010000
001000010000
001000010000
001000010000
001000010000
001000010000
步骤
-
初始化:
w = 12
,h = 7
。- 初始位置
(x, y) = (2, 1)
。 - 速度
(sx, sy) = (1, -1)
。 - 时间
t = 13
。 - 矩阵数据:
001000010000 001000010000 001000010000 001000010000 001000010000 001000010000 001000010000
-
模拟移动过程:
- 初始位置
(2, 1)
是1
,计数加1
。 - 移动 13 个时间单位,每次更新位置并检查是否为
1
。 - 经过 13 个时间单位后,物体经过
1
的点的次数为3
。
- 初始位置
-
输出结果:
3
。
复杂度分析
-
时间复杂度
- 模拟移动过程的时间复杂度为
O(t)
,其中t
是时间单位。 - 总时间复杂度为
O(t)
。
- 模拟移动过程的时间复杂度为
-
空间复杂度
- 存储矩阵数据的空间复杂度为
O(w * h)
。 - 总空间复杂度为
O(w * h)
。
- 存储矩阵数据的空间复杂度为
总结
本题的核心是通过模拟物体在矩阵中的移动过程,记录经过 1
的点的次数。关键在于:
- 处理物体在矩阵边缘的镜面反射。
- 每次移动后检查当前位置是否为
1
。 - 时间复杂度为
O(t)
,适合处理t
较小的输入。
二、JavaScript算法源码
这段 JavaScript 代码的功能是模拟一个在矩阵中“移动”的过程,并根据指定的规则统计符合条件的格子数。以下是代码的逐步解析。
代码概述
-
输入
w
、h
:矩阵的宽度和高度(列数和行数)。x
、y
:起始位置的横坐标和纵坐标(列号和行号)。sx
、sy
:水平和垂直的速度,表示每次移动的步数。t
:模拟的最大时间步数。
-
矩阵
- 输入的矩阵由字符
'0'
和'1'
组成,其中'1'
代表一个特定的目标。
- 输入的矩阵由字符
-
目标
- 目标是根据给定的规则在矩阵中移动并统计遇到的
'1'
的个数。
- 目标是根据给定的规则在矩阵中移动并统计遇到的
逐行分析
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;
- 使用 Node.js 的
readline
模块来异步读取输入。 iter
是readline
的异步迭代器,通过readline()
获取每一行输入。
let [w, h, x, y, sx, sy, t] = (await readline()).split(" ").map(Number);
- 读取输入的第一行,并将其拆分成数字:
w
:矩阵的列数。h
:矩阵的行数。x
:起始的列坐标(水平坐标)。y
:起始的行坐标(纵坐标)。sx
:水平移动步数(速度)。sy
:垂直移动步数(速度)。t
:移动的最大步数(时间)。
const matrix = [];
for (let i = 0; i < h; i++) {matrix.push(await readline());
}
- 初始化一个空的二维矩阵
matrix
。 - 使用
for
循环读取h
行,填充matrix
。
let ans = 0;
ans
用于记录遇到的'1'
的数量。
while (t >= 0) {if (matrix[y][x] == "1") {ans++;}
- 开始一个
while
循环,循环次数为t
。 - 如果当前位置的格子是
'1'
,则统计计数器ans
加 1。
y += sy;x += sx;
- 更新位置,
y
按照垂直方向的速度sy
变化,x
按照水平方向的速度sx
变化。
if (x < 0) {x = 1;sx = -sx;} else if (x >= w) {x = w - 2;sx = -sx;}
- 检查
x
(列坐标)是否越界:- 如果
x
小于 0(即超出了左边界),将x
设为 1,并且反转水平移动速度sx
(使其向右)。 - 如果
x
超出了右边界(即x >= w
),将x
设为w - 2
,并反转水平速度sx
(使其向左)。
- 如果
if (y < 0) {y = 1;sy = -sy;} else if (y >= h) {y = h - 2;sy = -sy;}
- 检查
y
(行坐标)是否越界:- 如果
y
小于 0(即超出了上边界),将y
设为 1,并反转垂直移动速度sy
(使其向下)。 - 如果
y
超出了下边界(即y >= h
),将y
设为h - 2
,并反转垂直速度sy
(使其向上)。
- 如果
t--;
}
- 每次循环结束后,减少
t
,表示已经消耗了一个时间步。
console.log(ans);
- 输出统计的
'1'
的数量,即在矩阵中遇到的目标数。
总结
-
问题本质:
- 这段代码模拟了一个物体在矩阵中根据给定的规则进行移动的过程。
- 如果当前位置是
'1'
,就增加计数器,最终输出计数器的值。
-
坐标的变化和边界处理:
- 通过检查坐标是否越界,并反转方向的方式确保物体在矩阵中“反弹”。
- 水平和垂直坐标的处理是独立的,根据具体的方向反转速度。
-
边界处理:
- 代码中明确处理了矩阵的上下左右边界,一旦超出边界,坐标反转。
输入输出示例
假设输入如下:
5 5 0 0 1 1 10
00000
00000
00100
00000
00000
w = 5, h = 5
:矩阵的大小为 5x5。x = 0, y = 0
:起始坐标是左上角。sx = 1, sy = 1
:每次水平方向和垂直方向都移动 1 步。t = 10
:模拟 10 步。
矩阵如下:
00000
00000
00100
00000
00000
- 起始时,坐标
(0, 0)
处的值是'0'
,然后按规则向下、向右移动。 - 每次遇到
'1'
统计一次。 - 代码会输出在 10 步内遇到的
'1'
的个数。
三、Java算法源码
这段 Java 代码的功能与之前的 JavaScript 代码类似,目的是在矩阵中模拟一个物体的移动过程,并根据规则统计移动过程中经过的 '1'
的数量。让我们逐行分析这段代码:
代码分析
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);
- 使用
Scanner
类读取输入数据。sc
是一个Scanner
对象,用于从标准输入读取数据。
int w = sc.nextInt();int h = sc.nextInt();int x = sc.nextInt();int y = sc.nextInt();int sx = sc.nextInt();int sy = sc.nextInt();int t = sc.nextInt();
- 读取输入数据:矩阵的宽度
w
、高度h
,起始位置(x, y)
,每步的水平和垂直速度sx
和sy
,以及模拟的最大时间步数t
。
char[][] matrix = new char[h][w];for (int i = 0; i < h; i++) {matrix[i] = sc.next().toCharArray();}
- 初始化一个二维字符数组
matrix
,用于存储矩阵中的每个字符。 - 使用循环读取矩阵的每一行,并将其转换为字符数组存储在
matrix
中。
int ans = 0;
- 初始化
ans
变量,用于统计遇到的'1'
的数量。
while (t >= 0) {
- 开始一个
while
循环,直到t
为负,表示已经完成所有时间步。
if (matrix[y][x] == '1') {ans++;}
- 检查当前位置的格子是否为
'1'
,如果是,增加ans
。
y += sy;x += sx;
- 更新当前位置
(x, y)
。y
按垂直方向速度sy
变化,x
按水平方向速度sx
变化。
if (x < 0) {x = 1;sx = -sx;} else if (x >= w) {x = w - 2;sx = -sx;}
- 判断水平方向的越界情况:
- 如果
x
小于 0(即超出了左边界),将x
设置为 1,并反转水平方向速度sx
(即使得物体向右移动)。 - 如果
x
超过了右边界(即x >= w
),将x
设置为w - 2
,并反转水平方向速度sx
(即使得物体向左移动)。
- 如果
if (y < 0) {y = 1;sy = -sy;} else if (y >= h) {y = h - 2;sy = -sy;}
- 判断垂直方向的越界情况:
- 如果
y
小于 0(即超出了上边界),将y
设置为 1,并反转垂直方向速度sy
(即使得物体向下移动)。 - 如果
y
超过了下边界(即y >= h
),将y
设置为h - 2
,并反转垂直方向速度sy
(即使得物体向上移动)。
- 如果
t--;}
- 每次循环结束后,减少
t
,表示时间步数已经消耗。
System.out.println(ans);}
}
- 输出统计结果
ans
,即在整个过程中遇到的'1'
的数量。
总结
这段 Java 代码模拟了一个物体在一个矩阵中按给定规则移动的过程,并统计经过的 '1'
的数量。代码中的关键步骤包括:
- 输入处理:通过
Scanner
读取矩阵的尺寸、起始坐标、速度以及最大时间步数。 - 矩阵处理:根据输入的矩阵,使用二维数组
matrix
存储每个格子的值('0'
或'1'
)。 - 边界检测:在每次移动后,检查是否越界,如果越界则反转物体的移动方向,并根据规则修正坐标。
- 统计
'1'
的数量:在每个时间步,检查当前位置是否是'1'
,如果是则增加计数。
示例输入输出
假设输入如下:
5 5 0 0 1 1 10
00000
00000
00100
00000
00000
w = 5, h = 5
:矩阵的宽度和高度分别为 5 和 5。x = 0, y = 0
:起始位置为左上角。sx = 1, sy = 1
:每次水平方向和垂直方向都移动 1 步。t = 10
:模拟 10 步。
矩阵如下:
00000
00000
00100
00000
00000
输出:
1
代码的复杂度分析
-
时间复杂度:每次循环中,更新位置、检查边界、统计
'1'
等操作都是常数时间操作。最坏情况下,循环会执行t
次,所以时间复杂度是O(t)
。 -
空间复杂度:存储矩阵的空间复杂度是
O(w * h)
,即矩阵的大小。
因此,整体的时间复杂度为 O(t)
,空间复杂度为 O(w * h)
。
四、Python算法源码
下面是对这段 Python 代码的详细注释和讲解:
1. 输入部分
w, h, x, y, sx, sy, t = map(int, input().split())
matrix = [input() for _ in range(h)]
-
w, h, x, y, sx, sy, t = map(int, input().split())
:- 使用
input().split()
获取一行输入并将其按空格分割,然后用map(int, ...)
将所有值转换为整数。它们分别代表:w
:矩阵的列数(宽度)。h
:矩阵的行数(高度)。x
:起始列坐标(水平坐标)。y
:起始行坐标(垂直坐标)。sx
:水平移动的速度(步长)。sy
:垂直移动的速度(步长)。t
:总的时间步数,模拟物体移动的步数。
- 使用
-
matrix = [input() for _ in range(h)]
:- 这里使用列表推导式,循环
h
次,读取每一行矩阵并存储为字符列表。每行是一个字符串,表示矩阵中的一行。 - 例如,若输入矩阵的某一行是
00100
,则matrix[i]
将是这个字符串。
- 这里使用列表推导式,循环
2. 算法部分
def getResult():global x, y, sx, sy, tans = 0
- 定义
getResult
函数,其中global x, y, sx, sy, t
表示在该函数中会使用和修改外部定义的变量x, y, sx, sy, t
。 ans = 0
:初始化一个变量ans
来统计遇到的'1'
的数量。
while t >= 0:
- 进入一个
while
循环,循环的条件是t >= 0
。每次循环代表一次时间步长,直到t
减少为负值为止。
if matrix[y][x] == '1':ans += 1
- 在当前的坐标
(x, y)
位置,检查矩阵中的字符是否为'1'
。如果是'1'
,就将ans
加 1,表示遇到一个目标。
y += syx += sx
- 更新当前坐标
(x, y)
:y += sy
:垂直坐标y
按照垂直速度sy
更新,向上或向下移动。x += sx
:水平坐标x
按照水平速度sx
更新,向左或向右移动。
if x < 0:x = 1sx = -sxelif x >= w:x = w - 2sx = -sx
- 处理水平边界:
- 如果
x < 0
(即移动超出了左边界),则将x
设置为 1,并反转水平速度sx
(即使得物体开始向右移动)。 - 如果
x >= w
(即移动超出了右边界),则将x
设置为w - 2
(确保物体不再越过边界),并反转水平速度sx
(即物体开始向左移动)。
- 如果
if y < 0:y = 1sy = -syelif y >= h:y = h - 2sy = -sy
- 处理垂直边界:
- 如果
y < 0
(即移动超出了上边界),则将y
设置为 1,并反转垂直速度sy
(即物体开始向下移动)。 - 如果
y >= h
(即移动超出了下边界),则将y
设置为h - 2
(确保物体不再越过边界),并反转垂直速度sy
(即物体开始向上移动)。
- 如果
t -= 1
- 每次循环后,减少
t
,表示已经消耗了一个时间步。
3. 返回结果
return ans
- 当时间步数
t
用完时,返回统计的结果ans
,即物体经过的'1'
的总数。
4. 算法调用部分
print(getResult())
- 调用
getResult()
函数并打印返回的结果,输出遇到的'1'
的数量。
完整工作流程
-
输入数据:
- 程序首先从用户输入中读取矩阵的尺寸、起始位置、速度和最大时间步数。
- 然后读取矩阵的内容,每个字符代表矩阵中的一部分。
-
模拟运动:
- 在矩阵中从起始位置
(x, y)
开始,按照给定的速度sx
和sy
移动。 - 每一步移动后检查当前位置是否是
'1'
,如果是,则增加ans
计数。 - 碰到矩阵边界时,会反转运动方向,继续在矩阵中反弹。
- 在矩阵中从起始位置
-
返回结果:
- 当经过所有时间步
t
后,返回统计的'1'
数量。
- 当经过所有时间步
示例说明
假设输入如下:
5 5 0 0 1 1 10
00000
00000
00100
00000
00000
w = 5, h = 5
:矩阵的宽度和高度是 5。x = 0, y = 0
:起始位置在矩阵的左上角。sx = 1, sy = 1
:每次水平方向和垂直方向都移动 1 步。t = 10
:模拟 10 步。
矩阵如下:
00000
00000
00100
00000
00000
运行过程:
- 从起始位置
(0, 0)
开始,向右向下移动。 - 第 3 步时,物体移动到
(2, 2)
,矩阵位置是'1'
,计数器ans
加 1。 - 随后物体反弹继续移动,直到时间步数
t
结束。
输出结果:
1
总结
这段代码通过模拟一个物体在矩阵中的移动,并根据碰到的 '1'
进行计数,最终输出物体经过的 '1'
的个数。关键的技术点包括边界检测和反弹的处理,每次越界时反转方向,确保物体不超出矩阵的范围。
五、C/C++算法源码:
模拟了一个物体在矩阵中按指定的速度移动,并统计它经过的 '1'
的数量。我们将逐步讲解每个部分,并转换为 C++ 版本。
C 语言代码转换为 C++ 代码
1. C 语言代码部分:
#include <stdio.h>#define MAX_SIZE 100int main() {int w, h, x, y, sx, sy, t;scanf("%d %d %d %d %d %d %d", &w, &h, &x, &y, &sx, &sy, &t);getchar();char matrix[MAX_SIZE][MAX_SIZE];for (int i = 0; i < h; i++) {gets(matrix[i]);}int ans = 0;while (t >= 0) {// 注意本题横纵坐标是反的,因此y其实是行号,x是列号if (matrix[y][x] == '1') {ans++;}y += sy;x += sx;if (x < 0) {x = 1;sx = -sx;} else if (x >= w) { // 注意本题横纵坐标是反的,因此x是列号,w是矩阵列数x = w - 2;sx = -sx;}if (y < 0) {y = 1;sy = -sy;} else if (y >= h) { // 注意本题横纵坐标是反的,因此y是行号,h是矩阵行数y = h - 2;sy = -sy;}t--;}printf("%d\n", ans);return 0;
}
转换为 C++ 代码
在 C++ 中,我们通常使用 iostream
来替代 stdio.h
来进行输入输出,使用 std::vector
或 std::string
来管理矩阵而不是固定大小的数组。我们还要避免使用 gets()
,因为它已经被废弃。我们改为使用 std::cin
和 std::getline()
来读取输入。
C++ 代码
#include <iostream>
#include <vector>
#include <string>#define MAX_SIZE 100using namespace std;int main() {int w, h, x, y, sx, sy, t;// 读取矩阵的宽度、高度、起始位置、速度和时间cin >> w >> h >> x >> y >> sx >> sy >> t;cin.ignore(); // 读取整行数据时,忽略前面换行符vector<string> matrix(h); // 使用 string 类型的 vector 存储每行的矩阵for (int i = 0; i < h; i++) {getline(cin, matrix[i]); // 读取每行矩阵}int ans = 0;while (t >= 0) {// 检查当前位置是否是 '1'if (matrix[y][x] == '1') {ans++;}// 更新当前位置y += sy;x += sx;// 水平方向越界检测if (x < 0) {x = 1;sx = -sx;} else if (x >= w) {x = w - 2;sx = -sx;}// 垂直方向越界检测if (y < 0) {y = 1;sy = -sy;} else if (y >= h) {y = h - 2;sy = -sy;}t--; // 每次模拟步数减 1}cout << ans << endl; // 输出遇到的 '1' 的数量return 0;
}
详细注释和讲解
1. 输入处理
cin >> w >> h >> x >> y >> sx >> sy >> t;
cin.ignore();
cin >> w >> h >> x >> y >> sx >> sy >> t;
:通过cin
从标准输入读取 7 个整数,分别代表矩阵的宽度w
、高度h
,起始位置(x, y)
,水平速度sx
,垂直速度sy
,以及最大时间步数t
。cin.ignore();
:在读取完整数后,使用cin.ignore()
忽略掉换行符,防止在读取矩阵时受到干扰。
2. 矩阵输入
vector<string> matrix(h);
for (int i = 0; i < h; i++) {getline(cin, matrix[i]);
}
vector<string> matrix(h);
:使用vector<string>
来存储矩阵,h
表示矩阵的行数。getline(cin, matrix[i]);
:每行输入用getline
来读取。getline
读取一整行并存储为字符串。
3. 变量初始化
int ans = 0;
ans
用来统计经过的'1'
的数量,初始值为 0。
4. 模拟过程
while (t >= 0) {if (matrix[y][x] == '1') {ans++;}y += sy;x += sx;if (x < 0) {x = 1;sx = -sx;} else if (x >= w) {x = w - 2;sx = -sx;}if (y < 0) {y = 1;sy = -sy;} else if (y >= h) {y = h - 2;sy = -sy;}t--;
}
while (t >= 0)
:每次循环代表一个时间步,直到t
小于 0 为止。if (matrix[y][x] == '1') { ans++; }
:检查当前坐标(x, y)
是否为'1'
,如果是则ans
增加 1。y += sy; x += sx;
:更新当前位置(x, y)
,根据水平速度sx
和垂直速度sy
移动。- 边界检测:
- 水平方向:如果
x < 0
,表示超出了左边界,则将x
设置为 1,并反转水平速度sx
;如果x >= w
,表示超出了右边界,则将x
设置为w - 2
,并反转水平速度sx
。 - 垂直方向:如果
y < 0
,表示超出了上边界,则将y
设置为 1,并反转垂直速度sy
;如果y >= h
,表示超出了下边界,则将y
设置为h - 2
,并反转垂直速度sy
。
- 水平方向:如果
- 每次时间步结束后,
t--
。
5. 输出结果
cout << ans << endl;
- 输出统计到的
ans
,即遇到的'1'
的数量。
总结
- 本代码模拟了一个物体在一个矩阵中按照给定的速度进行移动,并统计物体经过的
'1'
数量。 - 使用
vector<string>
存储矩阵内容,避免了固定大小数组的限制,同时也更方便处理动态大小的矩阵。 - 边界检测和反弹处理确保物体在矩阵边缘反弹,而不是超出边界。
- 最后通过
cout
输出遇到的'1'
的总数。
示例输入输出
输入:
5 5 0 0 1 1 10
00000
00000
00100
00000
00000
输出:
1
六、尾言
什么是华为OD?
华为OD(Outsourcing Developer,外包开发工程师)是华为针对软件开发工程师岗位的一种招聘形式,主要包括笔试、技术面试以及综合面试等环节。尤其在笔试部分,算法题的机试至关重要。
为什么刷题很重要?
-
机试是进入技术面的第一关:
华为OD机试(常被称为机考)主要考察算法和编程能力。只有通过机试,才能进入后续的技术面试环节。 -
技术面试需要手撕代码:
技术一面和二面通常会涉及现场编写代码或算法题。面试官会注重考察候选人的思路清晰度、代码规范性以及解决问题的能力。因此提前刷题、多练习是通过面试的重要保障。 -
入职后的可信考试:
入职华为后,还需要通过“可信考试”。可信考试分为三个等级:- 入门级:主要考察基础算法与编程能力。
- 工作级:更贴近实际业务需求,可能涉及复杂的算法或与工作内容相关的场景题目。
- 专业级:最高等级,考察深层次的算法以及优化能力,与薪资直接挂钩。
刷题策略与说明:
2024年8月14日之后,华为OD机试的题库转为 E卷,由往年题库(D卷、A卷、B卷、C卷)和全新题目组成。刷题时可以参考以下策略:
-
关注历年真题:
- 题库中的旧题占比较大,建议优先刷历年的A卷、B卷、C卷、D卷题目。
- 对于每道题目,建议深度理解其解题思路、代码实现,以及相关算法的适用场景。
-
适应新题目:
- E卷中包含全新题目,需要掌握全面的算法知识和一定的灵活应对能力。
- 建议关注新的刷题平台或交流群,获取最新题目的解析和动态。
-
掌握常见算法:
华为OD考试通常涉及以下算法和数据结构:- 排序算法(快速排序、归并排序等)
- 动态规划(背包问题、最长公共子序列等)
- 贪心算法
- 栈、队列、链表的操作
- 图论(最短路径、最小生成树等)
- 滑动窗口、双指针算法
-
保持编程规范:
- 注重代码的可读性和注释的清晰度。
- 熟练使用常见编程语言,如C++、Java、Python等。
如何获取资源?
-
官方参考:
- 华为招聘官网或相关的招聘平台会有一些参考信息。
- 华为OD的相关公众号可能也会发布相关的刷题资料或学习资源。
-
加入刷题社区:
- 找到可信的刷题交流群,与其他备考的小伙伴交流经验。
- 关注知名的刷题网站,如LeetCode、牛客网等,这些平台上有许多华为OD的历年真题和解析。
-
寻找系统性的教程:
- 学习一本经典的算法书籍,例如《算法导论》《剑指Offer》《编程之美》等。
- 完成系统的学习课程,例如数据结构与算法的在线课程。
积极心态与持续努力:
刷题的过程可能会比较枯燥,但它能够显著提升编程能力和算法思维。无论是为了通过华为OD的招聘考试,还是为了未来的职业发展,这些积累都会成为重要的财富。
考试注意细节
-
本地编写代码
- 在本地 IDE(如 VS Code、PyCharm 等)上编写、保存和调试代码,确保逻辑正确后再复制粘贴到考试页面。这样可以减少语法错误,提高代码准确性。
-
调整心态,保持冷静
- 遇到提示不足或实现不确定的问题时,不必慌张,可以采用更简单或更有把握的方法替代,确保思路清晰。
-
输入输出完整性
- 注意训练和考试时都需要编写完整的输入输出代码,尤其是和题目示例保持一致。完成代码后务必及时调试,确保功能符合要求。
-
快捷键使用
- 删除行可用
Ctrl+D
,复制、粘贴和撤销分别为Ctrl+C
,Ctrl+V
,Ctrl+Z
,这些可以正常使用。 - 避免使用
Ctrl+S
,以免触发浏览器的保存功能。
- 删除行可用
-
浏览器要求
- 使用最新版的 Google Chrome 浏览器完成考试,确保摄像头开启并正常工作。考试期间不要切换到其他网站,以免影响考试成绩。
-
交卷相关
- 答题前,务必仔细查看题目示例,避免遗漏要求。
- 每完成一道题后,点击【保存并调试】按钮,多次保存和调试是允许的,系统会记录得分最高的一次结果。完成所有题目后,点击【提交本题型】按钮。
- 确保在考试结束前提交试卷,避免因未保存或调试失误而丢分。
-
时间和分数安排
- 总时间:150 分钟;总分:400 分。
- 试卷结构:2 道一星难度题(每题 100 分),1 道二星难度题(200 分)。及格分为 150 分。合理分配时间,优先完成自己擅长的题目。
-
考试环境准备
- 考试前请备好草稿纸和笔。考试中尽量避免离开座位,确保监控画面正常。
- 如需上厕所,请提前规划好时间以减少中途离开监控的可能性。
-
技术问题处理
- 如果考试中遇到断电、断网、死机等技术问题,可以关闭浏览器并重新打开试卷链接继续作答。
- 出现其他问题,请第一时间联系 HR 或监考人员进行反馈。
祝你考试顺利,取得理想成绩!
相关文章:
【2024年华为OD机试】 (C卷,200分)- 反射计数(Java JS PythonC/C++)
一、问题描述 题目解析 题目描述 给定一个包含 0 和 1 的二维矩阵,一个物体从给定的初始位置出发,在给定的速度下进行移动。遇到矩阵的边缘时会发生镜面反射。无论物体经过 0 还是 1,都不影响其速度。请计算并给出经过 t 时间单位后&#…...
【微服务】SpringCloud 1-9章
1从Boot和Cloud版本选型开始说起 1.1Springboot版本选择 1.1.1git源码地址 https://github.com/spring-projects/spring-boot/releases/ 1.1.2官网看Boot版本 1.1.3SpringBoot3.0崛起 https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Release-Notes …...
Jmeter进行http接口并发测试
目录: 1、Jmeter设置(1)设置请求并发数(2)设置请求地址以及参数(3)添加结果数 2、启动看结果 1、Jmeter设置 (1)设置请求并发数 (2)设置请求地址…...
JavaScript语言的数据结构
JavaScript中的数据结构 引言 在编程的世界里,数据结构是处理和组织数据的重要方式。数据结构的选择往往直接影响到程序的性能和可维护性。JavaScript作为一门广泛使用的编程语言,在数据结构的设计和使用上也有其独特的特点。本文将深入探讨JavaScript…...
【数据分享】1929-2024年全球站点的逐日平均气温数据(Shp\Excel\免费获取)
气象数据是在各项研究中都经常使用的数据,气象指标包括气温、风速、降水、湿度等指标,其中又以气温指标最为常用!说到气温数据,最详细的气温数据是具体到气象监测站点的气温数据!本次我们为大家带来的就是具体到气象监…...
DETRs with Collaborative Hybrid Assignments Training论文阅读与代码
关键词:协作混合分配训练 【目标检测】Co-DETR:ATSS+Faster RCNN+DETR协作的先进检测器(ICCV 2023)-CSDN博客 摘要: 在这篇论文中,作者观察到在DETR中将过少的 Query 分配为正样本,采用一对一的集合匹配,会导致对编码器输出的监督稀疏,严重损害编码器的区分特征学习…...
某国际大型超市电商销售数据分析和可视化
完整源码项目包获取→点击文章末尾名片! 本作品将从人、货、场三个维度,即客户维度、产品维度、区域维度(补充时间维度与其他维度)对某国际大型超市的销售情况进行数据分析和可视化报告展示,从而为该超市在弄清用户消费…...
码云gitee 新建仓库 添加公钥
码云gitee 新建仓库 添加公钥 文章目录 码云gitee 新建仓库 添加公钥新建仓库生成公钥管理个人公钥安全验证 码云这个网站是一个代码托管平台,在国内可以无限制的使用,在这个网站上,也可以搜索到一些github上面的内容。进入这个网站ÿ…...
SQL 基础教程 - SQL SELECT INTO 语句
通过 SQL,您可以从一个表复制信息到另一个表。 SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。 SQL SELECT INTO 语句 SELECT INTO 语句从一个表复制数据,然后把数据插入到另一个新表中。 注意: MySQL 数据…...
《leetcode-runner》如何手搓一个debug调试器——指令系统
前文: 《leetcode-runner》如何手搓一个debug调试器——引言 《leetcode-runner》如何手搓一个debug调试器——架构 文章目录 什么是指令系统指令的组成部分leetcode-runner支持哪些指令如何解析用户输入的命令行指令识别流程 仓库地址:leetcode-runner …...
基于预共享密钥的IPsec实验
一、实验目的 (1)了解IPsec的原理和协议运行机制; (2)掌握IPsec身份认证的预共享密钥的配置; (3)掌握用Wireshark工具抓包分析IPsec数据包格式和协议流程。 二、实验设备与环境 &…...
Golang Gin系列-2:搭建Gin 框架环境
开始网络开发之旅通常是从选择合适的工具开始的。在这个全面的指南中,我们将引导你完成安装Go编程语言和Gin框架的过程,Gin框架是Go的轻量级和灵活的web框架。从设置Go工作空间到将Gin整合到项目中,本指南是高效而强大的web开发路线图。 安装…...
R语言绘图
多组火山图 数据准备: 将CSV文件同一在一个路径下,用代码合并 确保文件列名正确 library(fs) library(dplyr) library(tidyr) library(stringr) library(ggplot2) library(ggfun) library(ggrepel)# 获取文件列表 file_paths <- dir_ls(path &quo…...
Linux《Linux简介与环境的搭建》
在学习了C或者是C语言的基础知识之后就可以开始Linux的学习了,现在Linux无论是在服务器领域还是在桌面领域都被广泛的使用,所以Linxu也是我们学习编程的重要环节,在此接下来我们将会花大量的时间在Linxu的学习上。在学习Linux初期你可以会像初…...
.Net Core webapi 实现JWT认证
文章目录 需求准备创建JWT配置创建JWTService注册JWT创建中间件读取jwt的token在需要的接口上添加属性启动认证启动swagger的授权认证使用 需求 实现一个记录某个用户所有操作的功能 准备 创建你的webapi项目从nuget下载安装JWT资源包根据你的项目使用.net版本下载对应的jwt…...
SDL2:Android APP编译使用 -- SDL2多媒体库使用音频实例
SDL2:Android APP编译使用 3. SDL2:Android APP编译使用3.1 Android Studio环境准备:3.2 构建Android APP(1)方式一:快速构建APK工程(2)方式二:自定义APK工程(…...
gitignore忽略已经提交过的
已经在.gitignore文件中添加了过滤规则来忽略bin和obj等文件夹,但这些文件夹仍然出现在提交中,可能是因为这些文件夹在添加.gitignore规则之前已经被提交到Git仓库中了。要解决这个问题,您需要从Git的索引中移除这些文件夹,并确保…...
Visual Studio2019调试DLL
1、编写好DLL代码之后,对DLL项目的属性进行设置,选择待注入的DLL,如下图所示 2、生成DLL文件 3、将DLL设置为启动项目之后,按F5启动调试。弹出选择注入的exe的界面之后,使用代码注入器注入步骤2中生成的dllÿ…...
电力场景红外测温图像绝缘套管分割数据集labelme格式2436张1类别
数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件) 图片数量(jpg文件个数):2436 标注数量(json文件个数):2436 标注类别数:1 标注类别名称:["arrester"] 每个类别标注的框数&am…...
RV1126+FFMPEG推流项目(7)AI音频模块编码流程
一、AI 模块和外设麦克风的关系 AI 模块是 RV1126 芯片的一个重要组成部分。它的主要功能是将外部接入的麦克风采集到的模拟信号通过内置的驱动程序转换为数字信号。这意味着麦克风作为外设,提供音频输入信号,AI 模块通过其硬件和软件的结合,…...
从零开始启动一个Vue项目
目录 一、首先下载Node.js 二、安装vue脚手架vue-cli 三、使用vue-ui创建一个vue项目 四、vue项目目录结构 五、启动vue项目 方法一:cmd窗口启动 方法二:软件中启动 一、首先下载Node.js 可以去看我的上一篇博客: NodeJs的安装及环境…...
存储过程和触发器
目录 1、存储过程 1.1 存储过程的概述 1.2 存储过程的类型 1. 系统存储过程 2. 本地存储过程 3. 临时存储过程 4. 扩展存储过程 1.3 T-SQL创建存储过程 1.4 T-SQL执行存储过程 1.5 T-SQL查看存储过程 1.6 T-SQL修改存储过程 1.7 T-SQL删除存储过程 2、触发器 2.1 …...
改进果蝇优化算法之一:自适应缩小步长的果蝇优化算法(ASFOA)
自适应缩小步长的果蝇优化算法(ASFOA)是对传统果蝇优化算法的一种重要改进,旨在克服其后期种群多样性不足、容易过早收敛和陷入局部最优等问题。有关果蝇优化算法的详情可以看我的文章:路径规划之启发式算法之二十七:果蝇优化算法(Fruit Fly Optimization Algorithm,FOA…...
道旅科技借助云消息队列 Kafka 版加速旅游大数据创新发展
作者:寒空、横槊、娜米、公仪 道旅科技:科技驱动,引领全球旅游分销服务 道旅科技 (https://www.didatravel.com/home) 成立于 2012 年,总部位于中国深圳,是一家以科技驱动的全球酒店资源批发商…...
LLM - 大模型 ScallingLaws 的 CLM 和 MLM 中不同系数(PLM) 教程(2)
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/145188660 免责声明:本文来源于个人知识与公开资料,仅用于学术交流,欢迎讨论,不支持转载。 Scalin…...
游戏引擎学习第80天
Blackboard:增强碰撞循环,循环遍历两种类型的 t 值 计划对现有的碰撞检测循环进行修改,以便实现一些新的功能。具体来说,是希望处理在游戏中定义可行走区域和地面的一些实体。尽管这是一个2D游戏,目标是构建一些更丰富…...
CSS布局与响应式
学习链接 Grid网格布局 前端五大主流网页布局 flex布局看这一篇就够了 grid布局看这一篇就够了 用六个案例学会响应式布局 伸缩盒响应式页面布局实战 实现响应式布局的五种方式 - csdn 如何完成响应式布局,有几种方法?看这个就够了 响应式布局总…...
PyBroker:利用 Python 和机器学习助力算法交易
PyBroker:利用 Python 和机器学习助力算法交易 你是否希望借助 Python 和机器学习的力量来优化你的交易策略?那么你需要了解一下 PyBroker!这个 Python 框架专为开发算法交易策略而设计,尤其关注使用机器学习的策略。借助 PyBrok…...
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术
深入了解卷积神经网络(CNN):图像处理与深度学习的革命性技术 导语 卷积神经网络(CNN)是现代深度学习领域中最重要的模型之一,特别在计算机视觉(CV)领域具有革命性的影响。无论是图…...
彩色图像面积计算一般方法及MATLAB实现
一、引言 在数字图像处理中,经常需要获取感兴趣区域的面积属性,下面给出图像处理的一般步骤。 1.读入的彩色图像 2.将彩色图像转化为灰度图像 3.灰度图像转化为二值图像 4.区域标记 5.对每个区域的面积进行计算和显示 二、程序代码 %面积计算 cle…...
[Qt] Box Model | 控件样式 | 实现log_in界面
目录 1、样式属性 (1)盒模型(Box Model) 2、控件样式示例 (1)按钮 (2)复选框 (3)单选框 (4)输入框 (5)…...
内存与缓存:保姆级图文详解
文章目录 前言1、计算机存储设备1.1、硬盘、内存、缓存1.2、金字塔结构1.3、数据流通过程 2、数据结构内存效率3、数据结构缓存效率 前言 亲爱的家人们,创作很不容易,若对您有帮助的话,请点赞收藏加关注哦,您的关注是我持续创作的…...
IM聊天学习资源
文章目录 参考链接使用前端界面简单效果消息窗口平滑滚动至底部vue使用watch监听vuex中的变量变化 websocket握手认证ChatKeyCheckHandlerNettyChatServerNettyChatInitializer 参考链接 zzhua/netty-chat-web - 包括前后端 vue.js实现带表情评论功能前后端实现(仿…...
Redis 中 TTL 的基本知识与禁用缓存键的实现策略(Java)
目录 前言1. 基本知识2. Java代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 单纯学习Redis可以看我前言的Java基本知识路线!! 对于Java的基本知识推荐阅读: java框架…...
SpringMvc解决跨域问题的源码汇总。
看本文章前,需了解跨域的缘由。 其次,了解RequestMapping的基础原理 最后我们来解析SpringMvc是如何处理跨域问题的。 跨域信息配置 SpringMvc分为全局级别和局部级别两种,全局级别就是任何跨域请求都起作用。 全局级别 全局级别就是在配…...
25.1.17学习内容
B - 迷宫 Description 给定一个 NM 方格的迷宫,迷宫里有 T 处障碍,障碍处不可通过。 在迷宫中移动有上下左右四种方式,每次只能移动一个方格。数据保证起点上没有障碍。 给定起点坐标和终点坐标,每个方格最多经过一次…...
【开源免费】基于SpringBoot+Vue.JS欢迪迈手机商城(JAVA毕业设计)
本文项目编号 T 141 ,文末自助获取源码 \color{red}{T141,文末自助获取源码} T141,文末自助获取源码 目录 一、系统介绍二、数据库设计三、配套教程3.1 启动教程3.2 讲解视频3.3 二次开发教程 四、功能截图五、文案资料5.1 选题背景5.2 国内…...
Qt之文件系统操作和读写
Qt creator 6.80 MinGw 64bit 文本文件是指以纯文本格式存储的文件,如cpp和hpp文件。XML文件和JSON文件也是文本文件,只是使用了特定的标记符号定义文本的含义,读取这种文本文件需要先对内容解析再显示。 qt提供了两种读写文本文件的方法。…...
合合信息名片全能王上架原生鸿蒙应用市场,成为首批数字名片类应用
长期以来,名片都是企业商务沟通的重要工具。随着企业数字化转型,相较于传统的纸质名片,数字名片对于企业成员拓展业务、获取商机、提升企业形象等方面发挥着重要作用。近期,合合信息旗下名片全能王正式上线原生鸿蒙应用市场&#…...
万字长文介绍ARINC 653,以及在综合模块化航空电子设备(IMA)中的作用
文章目录 一、引言二、ARINC 653背景三、整体系统架构四、应用/执行(APEX)接口五、ARINC 653 RTOS内部机制六、健康监测功能七、软件应用八、ARINC 653现状九、总结 一、引言 在现代航空领域,综合模块化航空电子设备(IMA…...
jenkins-node节点配置
一.简述: Jenkins有一个很强大的功能: 即:支持分布式构建(jenkins配置中叫节点(node),也被称为slave)。分布式构建通常是用来吸收额外的负载。通过动态添加额外的机器应对构建作业中的高峰期,或在特定操作系统或环境运行特定的构建…...
【Flink系列】5. DataStream API
5. DataStream API DataStream API是Flink的核心层API。一个Flink程序,其实就是对DataStream的各种转换。具体来说,代码基本上都由以下几部分构成: 5.1 执行环境(Execution Environment) Flink程序可以在各种上下文…...
【tailscale 和 ssh】当服务器建立好节点,但通过客户端无法通过 ssh 连接
背景 当服务器建立好节点,一切显示正常但通过客户端无法通过 vs code 中的 ssh 连接到服务器 问题解决 因为服务器是重装过的,所以忘记在服务器上下载 ssh 了。。。安装完成并启动 SSH 服务后便可正常连接! sudo apt update sudo apt in…...
TDengine 做 Apache SuperSet 数据源
Apache Superset 是一个现代的企业级商业智能(BI)Web 应用程序,主要用于数据探索和可视化。它由 Apache 软件基金会支持,是一个开源项目,它拥有活跃的社区和丰富的生态系统。Apache Superset 提供了直观的用户界面…...
PCL 新增自定义点类型【2025最新版】
目录 一、自定义点类型1、前言2、定义方法3、代码示例二、合并现有类型三、点云按时间渲染1、CloudCompare渲染2、PCL渲染博客长期更新,本文最近更新时间为:2025年1月18日。 一、自定义点类型 1、前言 PCL库自身定义了很多点云类型,但是在使用的时候时如果要使用自己定义的…...
【记录52】el-table-column 添加fixed属性 滚动条无法滑动
问题: el-table-column 添加fixed属性 滚动条无法滑动 使用element UI组件,用到el-table的el-table-column的fixed属性时,当滚动条长度小于固定列时,滚动条无法通过鼠标去点击滑动操作 原因 fixed是用来固定列的属性,其…...
华为OD机试E卷 ---最大值
一、题目描述 给定一组整数(非负),重排顺序后输出一个最大的整数。 二、示例1 用例1 输入 10 9输出 910说明:输出结果可能非常大,所以你需要返回一个 字符串只而不是整数。 三、输入描述 数字组合 四、输出描述 最大的整数 五、解题思路 字符…...
服务器迁移MySQL
由于公司原有的服务器不再使用,需要将老的服务器上的MySQL迁移到新的服务器上,因此需要对数据进行备份迁移,前提是两台服务器已安装相同版本的MySQL,这里就不再讲解MySQL的安装步骤了,可以安装包、可以在线下载、可以容…...
.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上)
系列文章目录 1、.Net Core微服务入门系列(一)——项目搭建 2、.Net Core微服务入门全纪录(二)——Consul-服务注册与发现(上) 3、.Net Core微服务入门全纪录(三)——Consul-服务注…...
【Linux系统】分区挂载
我们能够根据一个 inode 号在指定分区寻找目标文件的 struct inode,也能根据目录文件的内容,通过映射关系,找指定的 inode,可是,现在有个问题: 问题:inode 是不能跨分区使用的!Linu…...