华为OD机试 - 采样过滤(Python/JS/C/C++ 2024 E卷 100分)

在这里插入图片描述

华为OD机试 2024E卷题库疯狂收录中,刷题点这里

专栏导读

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

一、题目描述

在做物理实验时,为了计算物体移动的速度,通过相机和等工具周期性的采样物体移动距离。
由于工具故障,采样数据存在误差甚至丢失。
需要通过一个算法过滤掉不正确的采样值,且不同工具的故障恢复存在差异,算法的各关门限会根据工具类型做相应的调整。

请实现一个算法,计算出给定一组采样数据中正常值的最长连续周期。

判断1个周期的采样数据 S0 是否正确的规则如下(假定物体移动速度不超过10个单位前一个采样周期 S[i-1]):

S[i] <= 0,即为错误值
S[i] < S[i-1],即为错误值
S[i] - S[i-1] >= 10,即为错误值。

其他情况为正常值。

判断工具是否故障的规则如下:

在 M 个周期内,采样数据为错误值的次数为 T(次数可以不连续),则工具故障。

判断故障恢复的条件如下:

产生故障后的 P 个周期内,采样数据一直为正常值,则故障恢复。

错误采样数据的处理方式:

检测到故障后,丢弃从故障开始到故障恢复的采样数据

在检测到工具故障之前,错误的采样数据,则由最后一个正常值代替;如果前面没有正常的采样值,则丢弃此采样数据。

给定一段周期的采样 数据列表,计算正常值的最长连续周期。

二、输入描述

故障确认周期数和故障恢复数T分别为M和T,故障恢复周期数为P。

第i个周期,检测点的状态为S[i]。

输入为两行,格式如下:

M T P
s1 s2 s3 …

M, T, 和 P 的取值范围为[1, 100000]

S 取值范围为[0, 100000],从0开始编号

三、输出描述

一行,输出正常值的最长连续周期。

四、测试用例

1、输入

10 6 3
-1 1 2 3 100 10 13 9 10

2、输出

8

3、说明

S[0]=-1 为错误,且没有前一个正常值,因此被丢弃。

S[1]=1 到 S[8]=10 中,只有 S[4]=100 和 S[7]=9, S[8]=10 是错误的,但总错误次数 3 < T=6,所以没有发生工具故障。

替换错误数据后,最长连续正常周期为 8。

五、解题思路

为了计算给定一组采样数据中正常值的最长连续周期,我们需要按照题目描述的规则对数据进行过滤,并实时跟踪最长的正常周期。

具体步骤如下:

  1. 判断采样数据是否正确:
    • 对于每个采样点 S[i],根据前一个采样点 S[i-1] 来判断其是否正确。
    • 第一个采样点 S[0] 仅需满足 S[0] > 0。
  2. 维护一个滑动窗口:
    • 使用一个固定大小为 M 的循环数组来跟踪最近 M 个周期内的错误次数。
    • 当窗口中错误次数达到或超过 T 时,标记工具为故障状态。
  3. 处理工具故障:
    • 一旦检测到工具故障,开始丢弃数据,直到连续 P 个周期的数据均为正常值,标记工具恢复正常。
    • 在故障恢复期间,错误的采样数据被丢弃。
  4. 替换错误数据:
    • 在工具未故障的情况下,如果检测到错误的采样数据且存在前一个正常值,则用前一个正常值替换错误数据。
    • 如果不存在前一个正常值,则丢弃该采样数据。
  5. 跟踪最长连续正常周期:
    • 在数据过滤的过程中,实时更新当前连续正常周期的长度,并记录最大值。
    • 通过上述步骤,可以有效过滤掉错误数据,并计算出最长的连续正常周期。

六、Python算法源码

# Python 代码实现import sysdef main():import sys# 读取输入的第一行,获取 M, T, Pfirst_line = sys.stdin.readline().strip()if not first_line:first_line = sys.stdin.readline().strip()M, T, P = map(int, first_line.split())# 读取第二行,获取所有采样数据second_line = sys.stdin.readline().strip()S = list(map(int, second_line.split()))N = len(S)# 初始化滑动窗口,用于记录最近 M 个周期内的错误次数window = [0] * M  # 滑动窗口数组,大小为 Mwindow_error_count = 0  # 当前滑动窗口内的错误次数window_index = 0  # 当前滑动窗口的索引# 初始化其他变量last_correct = None  # 存储最后一个正常的采样值current_run = 0  # 当前连续正常周期的长度max_run = 0  # 最大连续正常周期的长度fault_state = False  # 标记是否处于故障状态recovery_counter = 0  # 恢复计数器,记录连续正常周期数for i in range(N):if not fault_state:# 判断当前采样数据是否正确if i == 0:is_correct = S[i] > 0else:is_correct = (S[i] > 0) and (S[i] >= S[i-1]) and ((S[i] - S[i-1]) < 10)new_error_flag = 0 if is_correct else 1  # 错误标志,0表示正确,1表示错误# 更新滑动窗口中的错误次数window_error_count -= window[window_index]  # 减去即将被替换的旧值window[window_index] = new_error_flag  # 更新当前窗口位置的错误标志window_error_count += new_error_flag  # 增加新的错误标志window_index = (window_index + 1) % M  # 滑动窗口索引向后移动# 检查是否触发故障if window_error_count >= T:fault_state = True  # 进入故障状态recovery_counter = 0  # 重置恢复计数器current_run = 0  # 重置当前连续正常周期长度continue  # 开始丢弃数据if is_correct:last_correct = S[i]  # 更新最后一个正常值current_run += 1  # 当前连续正常周期长度加一if current_run > max_run:max_run = current_run  # 更新最大连续正常周期长度else:if last_correct is not None:# 用最后一个正常值替换错误数据current_run += 1  # 替换后视为正常,当前连续正常周期长度加一if current_run > max_run:max_run = current_run  # 更新最大连续正常周期长度else:# 没有正常值可替换,丢弃此数据current_run = 0  # 当前连续正常周期长度重置else:# 处于故障状态,丢弃数据# 判断当前采样数据是否正确,用于恢复if i == 0:is_correct = S[i] > 0else:is_correct = (S[i] > 0) and (S[i] >= S[i-1]) and ((S[i] - S[i-1]) < 10)if is_correct:recovery_counter += 1  # 连续正常周期数加一if recovery_counter >= P:fault_state = False  # 恢复正常状态recovery_counter = 0  # 重置恢复计数器# 重置滑动窗口window = [0] * Mwindow_error_count = 0window_index = 0current_run = 0  # 重置当前连续正常周期长度last_correct = None  # 重置最后一个正常值else:recovery_counter = 0  # 出现错误,恢复计数器重置# 输出最长连续正常周期长度print(max_run)if __name__ == "__main__":main()

七、JavaScript算法源码

// JavaScript 代码实现const readline = require('readline');const rl = readline.createInterface({input: process.stdin,output: process.stdout
});let inputLines = [];rl.on('line', (line) => {inputLines.push(line.trim());if (inputLines.length === 2) {rl.close();}
}).on('close', () => {// 读取第一行,获取 M, T, Plet [M, T, P] = inputLines[0].split(' ').map(Number);// 读取第二行,获取所有采样数据let S = inputLines[1].split(' ').map(Number);let N = S.length;// 初始化滑动窗口,用于记录最近 M 个周期内的错误次数let window = new Array(M).fill(0);  // 滑动窗口数组,大小为 Mlet window_error_count = 0;  // 当前滑动窗口内的错误次数let window_index = 0;  // 当前滑动窗口的索引// 初始化其他变量let last_correct = null;  // 存储最后一个正常的采样值let current_run = 0;  // 当前连续正常周期的长度let max_run = 0;  // 最大连续正常周期的长度let fault_state = false;  // 标记是否处于故障状态let recovery_counter = 0;  // 恢复计数器,记录连续正常周期数for (let i = 0; i < N; i++) {if (!fault_state) {// 判断当前采样数据是否正确let is_correct;if (i === 0) {is_correct = S[i] > 0;} else {is_correct = (S[i] > 0) && (S[i] >= S[i - 1]) && ((S[i] - S[i - 1]) < 10);}let new_error_flag = is_correct ? 0 : 1;  // 错误标志,0表示正确,1表示错误// 更新滑动窗口中的错误次数window_error_count -= window[window_index];  // 减去即将被替换的旧值window[window_index] = new_error_flag;  // 更新当前窗口位置的错误标志window_error_count += new_error_flag;  // 增加新的错误标志window_index = (window_index + 1) % M;  // 滑动窗口索引向后移动// 检查是否触发故障if (window_error_count >= T) {fault_state = true;  // 进入故障状态recovery_counter = 0;  // 重置恢复计数器current_run = 0;  // 重置当前连续正常周期长度continue;  // 开始丢弃数据}if (is_correct) {last_correct = S[i];  // 更新最后一个正常值current_run += 1;  // 当前连续正常周期长度加一if (current_run > max_run) {max_run = current_run;  // 更新最大连续正常周期长度}} else {if (last_correct !== null) {// 用最后一个正常值替换错误数据current_run += 1;  // 替换后视为正常,当前连续正常周期长度加一if (current_run > max_run) {max_run = current_run;  // 更新最大连续正常周期长度}} else {// 没有正常值可替换,丢弃此数据current_run = 0;  // 当前连续正常周期长度重置}}} else {// 处于故障状态,丢弃数据// 判断当前采样数据是否正确,用于恢复let is_correct;if (i === 0) {is_correct = S[i] > 0;} else {is_correct = (S[i] > 0) && (S[i] >= S[i - 1]) && ((S[i] - S[i - 1]) < 10);}if (is_correct) {recovery_counter += 1;  // 连续正常周期数加一if (recovery_counter >= P) {fault_state = false;  // 恢复正常状态recovery_counter = 0;  // 重置恢复计数器// 重置滑动窗口window = new Array(M).fill(0);window_error_count = 0;window_index = 0;current_run = 0;  // 重置当前连续正常周期长度last_correct = null;  // 重置最后一个正常值}} else {recovery_counter = 0;  // 出现错误,恢复计数器重置}}}// 输出最长连续正常周期长度console.log(max_run);
});

八、C算法源码

/* C 代码实现 */#include <stdio.h>
#include <stdlib.h>int main(){int M, T, P;// 读取 M, T, Pscanf("%d %d %d", &M, &T, &P);// 读取第二行的采样数据// 假设最大采样数量为100000,动态分配int *S = (int*)malloc(100000 * sizeof(int));int N = 0;while(scanf("%d", &S[N]) != EOF){N++;}// 初始化滑动窗口int *window = (int*)calloc(M, sizeof(int));  // 初始化为0int window_error_count = 0;int window_index = 0;// 初始化其他变量int last_correct = -1;  // -1表示没有正常值int current_run = 0;int max_run = 0;int fault_state = 0;  // 0表示正常,1表示故障int recovery_counter = 0;for(int i=0; i<N; i++){if(!fault_state){// 判断当前采样数据是否正确int is_correct;if(i ==0){is_correct = S[i] >0;}else{is_correct = (S[i] >0) && (S[i] >= S[i-1]) && ((S[i] - S[i-1]) <10);}int new_error_flag = is_correct ? 0 :1;// 更新滑动窗口中的错误次数window_error_count -= window[window_index];window[window_index] = new_error_flag;window_error_count += new_error_flag;window_index = (window_index +1) % M;// 检查是否触发故障if(window_error_count >= T){fault_state = 1;  // 进入故障状态recovery_counter =0;current_run =0;  // 重置当前连续正常周期长度continue;  // 开始丢弃数据}if(is_correct){last_correct = S[i];current_run +=1;if(current_run > max_run){max_run = current_run;}}else{if(last_correct != -1){// 用最后一个正常值替换错误数据current_run +=1;if(current_run > max_run){max_run = current_run;}}else{// 没有正常值可替换,丢弃此数据current_run =0;}}}else{// 处于故障状态,丢弃数据// 判断当前采样数据是否正确,用于恢复int is_correct;if(i ==0){is_correct = S[i] >0;}else{is_correct = (S[i] >0) && (S[i] >= S[i-1]) && ((S[i] - S[i-1]) <10);}if(is_correct){recovery_counter +=1;if(recovery_counter >= P){fault_state =0;  // 恢复正常状态recovery_counter =0;// 重置滑动窗口for(int j=0; j<M; j++){window[j] =0;}window_error_count =0;window_index =0;current_run =0;  // 重置当前连续正常周期长度last_correct = -1;  // 重置最后一个正常值}}else{recovery_counter =0;}}}// 输出最长连续正常周期长度printf("%d\n", max_run);// 释放内存free(S);free(window);return 0;
}

九、C++算法源码

// C++ 代码实现#include <bits/stdc++.h>
using namespace std;int main(){ios::sync_with_stdio(false);cin.tie(0);int M, T, P;// 读取 M, T, Pcin >> M >> T >> P;// 读取第二行的采样数据vector<int> S;int num;while(cin >> num){S.push_back(num);}int N = S.size();// 初始化滑动窗口vector<int> window(M, 0);  // 滑动窗口数组,大小为 Mint window_error_count = 0;int window_index = 0;// 初始化其他变量int last_correct = -1;  // -1表示没有正常值int current_run = 0;int max_run = 0;bool fault_state = false;  // 标记是否处于故障状态int recovery_counter = 0;for(int i=0; i<N; i++){if(!fault_state){// 判断当前采样数据是否正确bool is_correct;if(i ==0){is_correct = S[i] >0;}else{is_correct = (S[i] >0) && (S[i] >= S[i-1]) && ((S[i] - S[i-1]) <10);}int new_error_flag = is_correct ? 0 :1;// 更新滑动窗口中的错误次数window_error_count -= window[window_index];window[window_index] = new_error_flag;window_error_count += new_error_flag;window_index = (window_index +1) % M;// 检查是否触发故障if(window_error_count >= T){fault_state = true;  // 进入故障状态recovery_counter =0;current_run =0;  // 重置当前连续正常周期长度continue;  // 开始丢弃数据}if(is_correct){last_correct = S[i];current_run +=1;if(current_run > max_run){max_run = current_run;}}else{if(last_correct != -1){// 用最后一个正常值替换错误数据current_run +=1;if(current_run > max_run){max_run = current_run;}}else{// 没有正常值可替换,丢弃此数据current_run =0;}}}else{// 处于故障状态,丢弃数据// 判断当前采样数据是否正确,用于恢复bool is_correct;if(i ==0){is_correct = S[i] >0;}else{is_correct = (S[i] >0) && (S[i] >= S[i-1]) && ((S[i] - S[i-1]) <10);}if(is_correct){recovery_counter +=1;if(recovery_counter >= P){fault_state = false;  // 恢复正常状态recovery_counter =0;// 重置滑动窗口fill(window.begin(), window.end(), 0);window_error_count =0;window_index =0;current_run =0;  // 重置当前连续正常周期长度last_correct = -1;  // 重置最后一个正常值}}else{recovery_counter =0;}}}// 输出最长连续正常周期长度cout << max_run << "\n";return 0;
}

🏆下一篇:华为OD机试真题 - 简易内存池(Python/JS/C/C++ 2024 E卷 200分)

🏆本文收录于,华为OD机试真题(Python/JS/C/C++)

刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1559240.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

YOLO11涨点优化:注意力魔改 | 双重注意力机制DoubleAttention,有效地捕获图像中不同位置和不同特征的重要性

💡💡💡本文改进内容: DoubleAttention该网络结构采用双重注意力机制,包括Spatial Attention和Channel Attention,有效地捕获图像中不同位置和不同特征的重要性 💡💡💡本文改进:分别加入到YOLO11的backbone、neck、detect,助力涨点 改进1结构图: 改进2结构图…

STM32—W25Q64

1.W25Q64简介 W25Oxx系列是一种低成本、小型化、使用简单的非易失性存储器 易失性存储器 般就是SRAM、DRAM等非易失性存储器 般就是E2PROM、Flash等常应用于数据存储、字库存储、固件程序存储等场景存储介质&#xff1a;Nor Flash(闪存)时钟频率&#xff1a;80MHz / 160MHz(…

C语言 | 第十三章 | 二维数组 冒泡排序 字符串指针 断点调试

P 120 数组应用案例 2023/1/29 一、应用案例 案例一&#xff1a;创建一个char类型的26个元素的数组&#xff0c;分别 放置’A’-Z‘。使用for循环访问所有元素并打印出来。提示&#xff1a;字符数据运算 ‘A’1 -> ‘B’ #include<stdio.h>void main(){/*创建一个c…

Mysql中创建用户并设置任何主机连接

Mysql中创建用户并设置任何主机连接 文章目录 Mysql中创建用户并设置任何主机连接背景解决方式 背景 在linux上安装mysql,默认用户是root,但是用navicat连接不了,必须要用ssh隧道连接,现在想用任何主机只要输入账号密码之后就可以连接 解决方式 #创建一个指定用户和IP链接的用…

通过祖先序列重建辅助工程化UDP-糖基转移酶-文献精读64

Engineering the Substrate Specificity of UDP-Glycosyltransferases for Synthesizing Triterpenoid Glycosides with a Linear Trisaccharide as Aided by Ancestral Sequence Reconstruction 通过祖先序列重建辅助工程化UDP-糖基转移酶的底物特异性&#xff0c;用于合成具…

股市有人吹的“哨音”也应倾听

国庆节前&#xff0c;深圳东方港湾投资管理股份有限公司董事长但斌发微博警告说&#xff1a;“这样暴涨&#xff0c;必有暴跌&#xff0c;这次如果再被套住&#xff0c;该动员的力量都动员了解套将遥遥无期”他这样警告&#xff0c;就与新冠病毒刚在武汉爆发时的“吹哨人”起的…

重头开始嵌入式第四十六天(硬件 ARM裸机开发 ADC 中断 UART)

目录 ADC使用 1.什么是ADC&#xff1f; 一、功能 二、工作原理 三、参数指标 四、应用领域 2.如何配置s3c2440中的adc&#xff1f; 中断 1.什么是中断&#xff1f; 一、定义 二、中断的作用 三、中断的类型 四、中断处理过程 2.如何配置中断&#xff1f; UART 1…

一站式服务,产业园运营让创业更轻松!

一站式服务&#xff0c;也被称为“一条龙服务”或“全流程服务”&#xff0c;它是指企业或机构为了满足客户或用户的需求&#xff0c;整合内部资源&#xff0c;通过优化服务流程、提高服务效率&#xff0c;从而提供从咨询、受理、办理到反馈等各个环节的完整、连续、高效的服务…

汽车主机厂主数据管理中一物多码或多码一物问题的具体表现有哪些?

数据入口多导致重复编码 在汽车主机厂的主数据管理中&#xff0c;由于存在多个数据入口&#xff0c;不同部门或环节可能会独立进行数据录入。这就容易出现一物多码或多码一物的情况。例如&#xff0c;采购部门、生产部门、物流部门等可能各自采用不同的编码体系来标识同一种汽…

车辆路径规划问题(VRP)优化方案

车辆路径规划问题&#xff08;VRP&#xff09;优化方案 车辆路径规划问题&#xff08;Vehicle Routing Problem, VRP&#xff09;是物流领域中一个经典的组合优化问题&#xff0c;目标是在满足客户需求的情况下&#xff0c;找到一组车辆的最优配送路径&#xff0c;以最小化总的…

PMP11月考试中文报名10月9日开始!

经过PMI与中国国际人才交流基金会的联合研究决定&#xff0c;2024年度第四期PMI认证考试将于11月30日进行。 为了让各位考生能够充分准备&#xff0c;我们特此梳理了本次考试的具体安排及注意事项&#xff0c;请务必仔细阅读&#xff01; 报名时间安排&#xff1a; &#xf…

使用Python批量修改文件修改日期为随机的6到8月份

使用Python批量修改文件修改日期为随机的6到8月份 每当雪花飘起的时候&#xff0c;总有一股抹不去的情节&#xff0c;会想起儿时雪天的记忆&#xff0c;虽然模糊但也清晰。那时每年的冬季很冷&#xff0c;但依然喜欢飘雪的日子&#xff0c;看着满天迷蒙飘舞的雪花总有想不完的心…

microsoft edge浏览器卡死问题

win11经常遇到microsoft edge浏览器卡死的情况&#xff0c;有时候是一会没用浏览器就全部卡死&#xff0c;有时候是锁屏或者电脑休眠浏览器就不能用&#xff0c;找了很多的办法都没好使&#xff0c;用以下方法好使了&#xff1a; edge浏览器中打开 edge://settings/system 把 …

架设传奇SF时提示此服务器满员,GEE引擎点开始游戏弹出服务器满员的解决方法

昨天一个朋友在架设GEE的传奇服务端时遇到一个奇怪的问题&#xff0c;就是在服务器外网架设时&#xff0c;建好角色点开始游戏提示此服务器满员&#xff0c;这个问题一般比较少见&#xff0c;而且出现的话一般都是GEE引擎的版本。 他折腾了半天&#xff0c;一直没进游戏&#x…

apt update报错:ModuleNotFoundError: No module named ‘apt_pkg‘(可能是默认python版本被改坏了)

文章目录 错误信息分析1. 确保 apt_pkg 模块已安装2. 检查 Python 版本3. 重新配置 Python4. 修复损坏的依赖5. 检查环境变量 尝试 错误信息 (base) rootkyai:/ky/tml/ky_ai_get_server_info# apt update 获取:1 file:/var/cuda-repo-cross-aarch64-ubuntu2004-11-4-local InR…

简易入门:使用Docke 部署一个tomcat服务

简易入门&#xff1a;使用Docke 部署一个tomcat服务 # 拉取 >docker pull tomcat:9.0# 后台运行容器&#xff0c;端口映射为8080. -p 宿主机端口:容器端口 >docker run -d --name tomcat-c-01 -p 8080:8080 tomcat:9.0# 查看容器id >docker ps CONTAINER ID IMAG…

Go语言对接微信支付与退款全流程指南

在互联网技术日益发展的今天&#xff0c;线上支付已成为不可或缺的一部分。作为一门简洁高效的编程语言&#xff0c;Go&#xff08;又称Golang&#xff09;凭借其强大的并发处理能力和高效性能&#xff0c;在后端开发领域越来越受到开发者的青睐。本文将详细介绍如何使用Go语言…

【Java SE基础回顾】看这篇就够了!

JavaSE复习 参考视频&#xff1a;【狂神说Java】JavaSE阶段回顾总结 简单的就不讲了&#xff0c;比如什么break和continue区别&#xff0c;甚至一些什么什么继承封装多态的概念等等。 主要写一些Java特有的&#xff0c;重点的基础知识。主要还是例子和代码更多&#xff0c;更有…

对象存储之阿里云OSS最详细的实现

Hello&#xff0c;大家好&#xff0c;我是Feri&#xff0c;一枚十多年的程序员&#xff0c;同时也是一名在读研究生&#xff0c;关注我&#xff0c;且看一个平凡的程序员如何在自我成长&#xff0c;只为各位小伙伴提供编程相关干货知识&#xff0c;希望在自我蜕变的路上&#x…

【JS】环形链表怎么找入口?

思路 判断是否有环&#xff1a;定义快慢指针&#xff0c;慢指针&#xff08;slow&#xff09;走一步&#xff0c;快指针&#xff08;fast&#xff09;走两步。 无环&#xff1a;快指针最终会到达链表的末尾&#xff08;即fast.next为null&#xff09;,永远不可能相遇有环&#…