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

华为OD新系统机试真题-计算数列位置N的值(Py/Java/C/C++/Js/Go)

计算数列位置N的值

华为OD机试新系统 - 华为OD上机考试新系统 4月1号 100分题型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/582940/

相关文章:

  • 2026年市面上靠谱的称重结算系统制造商联系方式,餐厅消费机/物资验收秤/智慧食堂案例,称重结算系统品牌如何选 - 品牌推荐师
  • python web框架streamlit
  • R-Studio实战评测:对比三款软件后,它为何成了我的数据恢复首选?
  • 06_语义网之SKOS知识组织系统
  • **AI仿真人剧企业2025推荐,沉浸式交互体验与多场景商业落地解析**据中国信通院2025数字内容与人工智能融合应用白皮书显示,2025年国内AI仿真人剧市场规模预计突破120亿元,但能提供完整
  • 仿美团饿了么外卖系统源码解析:构建高效外卖平台的技术指南
  • **React 项目实战:从状态管理到性能优化的全流程精讲**在现代前端开发中,*
  • GESP2025年3月认证C++三级( 第三部分编程题(2、词频统计)
  • 拟南芥基因家族序列的高效提取与ID处理技巧
  • docker 安装 MrDoc
  • OriginPro 2023保姆级教程:三步搞定柱状图+点线图组合,让你的科研图表颜值飙升
  • CT107D开发板实战:从零搭建51单片机红外遥控系统(附完整代码)
  • 基于S7-200 PLC的教室灯控制系统的全面设计与实现:电气设计、程序设计及组态王的应用
  • **AI仿真人剧厂家2025推荐,专业定制与沉浸式体验的行业标杆**据中国信通院2025年人工智能数字内容产业白皮书显示,2025年国内AI仿真人剧市场规模预计突破120亿元,年增长率高达65%。
  • 2025最权威的降重复率方案实际效果
  • 告别黑屏!用Wireshark+RSView调试速腾雷达,一次讲清IP、端口和点云显示的逻辑
  • 嘎嘎降AI和去AIGC哪个更适合文科论文?深度对比评测
  • 建议收藏!我开发了一个免费无限制的AI绘画公益站!
  • 暗黑破坏神2存档修改神器:从入门到精通的完整指南
  • 若依框架代码生成器深度使用指南:从单表生成到理解其MVC代码结构
  • Python实战:5分钟搞定Infoway期货行情API接入(附完整代码)
  • 基于四轮转向与模型预测控制的轨迹跟踪控制策略及其转角分配研究——前轮与四轮转向轨迹跟踪效果对比
  • ViGEmBus技术指南:构建跨平台游戏控制器兼容解决方案
  • 四路抢答器这玩意儿在竞赛现场特别实用,今天咱们直接开整基于西门子S7-200 PLC和MCGS触摸屏的实现方案。老规矩,先从硬件接线开始唠
  • 如何用LAMP.sh构建企业级Web应用环境?完整部署方案解析
  • 2025届学术党必备的六大降重复率平台实际效果
  • Python-for-Android终极指南:用Python代码打造原生Android应用
  • 开关电源12种拓扑功率器件选型指南
  • OpenClaw效率对比:人工vsQwen2.5-VL-7B处理100张图片耗时测试
  • Spring AI 助力 Java 开发者构建全功能 AI 智能体