当前位置: 首页 > news >正文

华为OD新系统机试真题 2026-04-01 【计算数列位置N的值】

计算数列位置N的值(Py/Java/C/C++/Js/Go)

华为OD机试新系统机试 - 华为OD上机考试新系统 4月1号 100分题型

华为OD机试真题目录点击查看: 华为OD机试真题题库目录|机考题库 + 算法考点详解

题目描述

  1. 输入MN两个数,则按照以下规则形成一个数列。
  2. 数列的前M个元素的值为1M
  3. M+1个元素开始,计算逻辑为
    1. 如果其前M个元素中,存在值相同的元素,则该位置上的数值等于前M个数中最大数值与最小数值之和。
    2. 如果其前M个元素中,不存在值相同的元素,则该位置上的数值等于前M个数中最大的数值和最小数值之差。

请计算该数列第N个位置上的数值

补充

  • 3 <= M <= 10
  • 1 <= N <= 50

输入描述

输出N和M,使用,分割

输出描述

输出N位置上的数值

用例1

输入

5,1

输出

1

题解

思路:逻辑分析

  1. 此题数据量比较小,暴力递推所有前n个位置的值。
  2. 对于n <= m的情况可以直接,返回n。
  3. 对于n > m的情况,对于m+1及之后的位置可直接通过模拟,判断前n个数是否存在重复值,并记录最大值、最小值。从而确认当前位置值。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> #include<set> #include<climits> using namespace std; int positionValue(int m , int n) { // 小于情况就是n if (n <= m) { return n; } vector<int> num(n + 1); // 初始化 for (int i = 1; i <= m; i++) { num[i] = i; } // 数据量小->递推 for (int i = m + 1; i <= n; i++) { int mx = INT_MIN, mn = INT_MAX; set<int> s; bool dupFlag = false; for (int j = i - m; j < i; j++) { if (s.count(num[j])) { dupFlag = true; } s.insert(num[j]); mx = max(mx, num[j]); mn = min(mn, num[j]); } if (dupFlag) { num[i] = mx + mn; } else { num[i] = mx - mn; } } return num[n]; } int main() { int m, n; scanf("%d,%d", &m, &n); int res = positionValue(m, n); cout << res; return 0; }

JAVA

import java.util.*; public class Main { public static int positionValue(int m, int n) { // 小于情况就是n if (n <= m) { return n; } int[] num = new int[n + 1]; // 初始化 for (int i = 1; i <= m; i++) { num[i] = i; } // 数据量小->递推 for (int i = m + 1; i <= n; i++) { int mx = Integer.MIN_VALUE, mn = Integer.MAX_VALUE; HashSet<Integer> set = new HashSet<>(); boolean dupFlag = false; for (int j = i - m; j < i; j++) { if (set.contains(num[j])) { dupFlag = true; } set.add(num[j]); mx = Math.max(mx, num[j]); mn = Math.min(mn, num[j]); } if (dupFlag) { num[i] = mx + mn; } else { num[i] = mx - mn; } } return num[n]; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); String[] parts = input.split(","); int m = Integer.parseInt(parts[0]); int n = Integer.parseInt(parts[1]); System.out.println(positionValue(m, n)); } }

Python

importsysdefpositionValue(m,n):# 小于情况就是nifn<=m:returnn num=[0]*(n+1)# 初始化foriinrange(1,m+1):num[i]=i# 数据量小->递推foriinrange(m+1,n+1):mx=-10**9mn=10**9s=set()dupFlag=Falseforjinrange(i-m,i):ifnum[j]ins:dupFlag=Trues.add(num[j])mx=max(mx,num[j])mn=min(mn,num[j])ifdupFlag:num[i]=mx+mnelse:num[i]=mx-mnreturnnum[n]if__name__=="__main__":m,n=map(int,sys.stdin.readline().strip().split(","))print(positionValue(m,n))

JavaScript

constreadline=require('readline');functionpositionValue(m,n){// 小于情况就是nif(n<=m)returnn;constnum=newArray(n+1).fill(0);// 初始化for(leti=1;i<=m;i++){num[i]=i;}// 数据量小->递推for(leti=m+1;i<=n;i++){letmx=-Infinity,mn=Infinity;letset=newSet();letdupFlag=false;for(letj=i-m;j<i;j++){if(set.has(num[j])){dupFlag=true;}set.add(num[j]);mx=Math.max(mx,num[j]);mn=Math.min(mn,num[j]);}if(dupFlag){num[i]=mx+mn;}else{num[i]=mx-mn;}}returnnum[n];}constrl=readline.createInterface({input:process.stdin,output:process.stdout});rl.on('line',function(line){let[m,n]=line.split(',').map(Number);console.log(positionValue(m,n));});

Go

packagemainimport("bufio""fmt""os")funcpositionValue(mint,nint)int{// 小于情况就是nifn<=m{returnn}num:=make([]int,n+1)// 初始化fori:=1;i<=m;i++{num[i]=i}// 数据量小->递推fori:=m+1;i<=n;i++{mx:=-1<<31mn:=1<<31-1set:=make(map[int]bool)dupFlag:=falseforj:=i-m;j<i;j++{ifset[num[j]]{dupFlag=true}set[num[j]]=trueifnum[j]>mx{mx=num[j]}ifnum[j]<mn{mn=num[j]}}ifdupFlag{num[i]=mx+mn}else{num[i]=mx-mn}}returnnum[n]}funcmain(){reader:=bufio.NewReader(os.Stdin)varm,nintfmt.Fscanf(reader,"%d,%d",&m,&n)fmt.Println(positionValue(m,n))}

C语言

#include<stdio.h>#include<limits.h>intpositionValue(intm,intn){// 小于情况就是nif(n<=m){returnn;}intnum[55]={0};// n <= 50// 初始化for(inti=1;i<=m;i++){num[i]=i;}// 数据量小->递推for(inti=m+1;i<=n;i++){intmx=INT_MIN,mn=INT_MAX;// 记录出现次数,用于判断去重(值域是可以计算出来的)intfreq[200000]={0};intdupFlag=0;for(intj=i-m;j<i;j++){if(freq[num[j]]==1){dupFlag=1;}freq[num[j]]++;if(num[j]>mx)mx=num[j];if(num[j]<mn)mn=num[j];}if(dupFlag){num[i]=mx+mn;}else{num[i]=mx-mn;}}returnnum[n];}intmain(){intm,n;scanf("%d,%d",&m,&n);printf("%d\n",positionValue(m,n));return0;}
http://www.jsqmd.com/news/749212/

相关文章:

  • FTRL与BFCL在线学习算法对比测试与工程实践
  • MotionStream技术:实时运动控制与视频生成的深度耦合
  • 联邦学习频域防御:ProtegoFed抗后门攻击实践
  • 气体放电管(GDT)原理与防雷保护应用解析
  • C++数据结构--队列
  • 实时视频生成技术:MotionStream框架解析与应用
  • 智能代理开发:从代码到AI行为模式的设计
  • Git实践——GitLab服务器的部署与使用
  • 密集图像描述技术:规则系统与强化学习的融合创新
  • FTRL与BFCL在线学习算法性能对比与工程实践
  • 全国cppm报考和scmp报考TOP1(怎么报名及流程) - 众智商学院课程中心
  • 别再死记硬背公式了!用MATLAB动画演示混频器如何‘搬动’频谱(附代码)
  • 逻辑谬误识别:合成数据增强与LLM训练实践
  • 2026年3P防爆空调技术解析:分体式防爆空调/单元式防爆空调/壁挂式防爆空调/多联式防爆空调/天井式防爆空调/选择指南 - 优质品牌商家
  • MotionStream:实时视频生成框架的技术解析与应用
  • 冷轧不锈钢卷深度技术分享:镜面不锈钢板、201 不锈钢卷、201不锈钢板、304 不锈钢卷、304不锈钢板、316L不锈钢卷选择指南 - 优质品牌商家
  • 11.5B参数、1.2EFLOPS、训练从数周压到数小时:他们把通用原子势训练带入Exascale时代
  • MoltLock分布式锁:现代应用的高性能并发控制解决方案
  • Legacy-iOS-Kit架构深度解析:5大模块实现旧设备系统降级与性能重塑
  • 从单口到四口:基于Xilinx FPGA的10G UDP多网卡方案设计与资源开销全解析(KU060/KU5P/ZU9EG实测)
  • 探索未来操作系统:从微内核到分布式架构的无限扩展性设计
  • AI智能体工作流管理:基于文件系统的上下文持久化与协作框架
  • OpenSubject视频数据集自动化筛选技术与工程实践
  • MetaClaw框架:实现大模型动态进化的双循环学习机制
  • Python 数据分析基础入门:《Excel Python:飞速搞定数据分析与处理》学习笔记系列(附录 A Conda 环境)
  • 基于MCP协议构建AI智能体与社交媒体API的安全交互网关
  • 2026年4月诚信的工业厂房搭建企业推荐,定制化门窗设计,厂房采光通风俱佳 - 品牌推荐师
  • 大语言模型计数能力解析与优化实践
  • 华为OD新系统机试真题 2026-04-08 【准备生日礼物】
  • 【优化求解】通过信号灯交叉路口的连接燃料电池混合动力车的生态驾驶双层凸优化附matlab代码