news 2026/6/6 7:19:28

华为OD机考双机位B卷 - 贪吃的猴子 (Java Python JS C/C++ GO )

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD机考双机位B卷 - 贪吃的猴子 (Java Python JS C/C++ GO )

最新华为上机考试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
2025华为od机试双机位B卷

题目描述

只贪吃的猴子,来到一个果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组numbers给出。

猴子获取香蕉,每次都只能从行的开头或者末尾获取,并且只能获取N次,求猴子最多能获取多少根香蕉。

输入描述

第一行为数组numbers的长度

第二行为数组numbers的值每个数字通过空格分开

第三行输入为N,表示获取的次数

备注:

  • 1 ≤ numbers.length ≤ 100000
  • 1 ≤ numbers ≤ 100
  • 1 ≤ N ≤ numbers.length

输出描述

按照题目要求能获取的最大数值

用例

输入

7 1 2 2 7 3 6 1 3

输出

10

说明

第一次获取香蕉,无论是从行的开头或者末尾获取,得到的香蕉根数目为1, 但是,从行末尾获取能获取到最优的策略,后面可以直接得到香蕉根数目6和3。因此最终根数为1+6+3=10

用例2

输入

3 1 2 3 3

输出

6

说明

全部获取所有的香蕉,因此最终根数为1+2+3=6

用例3

输入

4 4 2 2 3 2

输出

7

说明

第一次获取香蕉为行的开头,第二次获取为行的末尾,因此最终根数为4+3=7

题目解析

要求从:每次都只能从行的开头或者末尾获取

我们以用例1解释题目:

1 2 2 7 3 6 1

每次都是开头或末尾:

第一次:开头和末尾都是1,

第二次:

如果我们第一次是开头,此时数字就是【2 2 7 3 6 1】,开头就是2 结尾就是1。

如果我们第一次是结尾,此时数字就是【1 2 2 7 3 6 】,开头就是1 结尾就是6。

这样我们就会发现第一次选末尾 第二次选末尾,第三次仍然选末尾,这样就是最多根。

我们以用例3解释题目:

4 2 2 3

我们一眼可以看出,第一次选开头 第二次选末尾。

从这两个例子,我们好像找不到啥规律啊,但是我们把视角转到选不到的桃子,你会发现,无论每次是选开头还是结尾,选不到的桃子永远是连续的,对不对!!! 再转念一想,我们把数组看成一个环,选中的开头和结尾是不是也就是连续的啊。这样我们自然而然就想到了**【滑动窗口】**

试验了两种解法,一种的选中的是连续的一种是未选中的连续(选中的就是数组-未选中的)。我觉得从未选中的角度去解题比较简单。

最终就转换为:求某个连续的区间是的总和最小。

解题思路

  1. 读取输入,包括数组长度、数组元素(每串香蕉的数量),以及猴子可以获取的次数。
  2. 计算数组中所有香蕉的总数。
  3. 如果猴子可以获取的次数等于数组长度,即猴子可以拿走所有的香蕉,直接返回总数。
  4. **计算猴子不能拿走的连续香蕉串的最小总数。**这是通过滑动窗口实现的,窗口大小为数组长度 - N
  5. 初始化滑动窗口的和为窗口内的第一段连续香蕉串的和。
  6. 滑动窗口,每次向右移动一位,更新窗口和,并记录最小的窗口和。
  7. 猴子能获取的最大香蕉数是总和减去最小窗口和。

模拟计算过程

给定输入:

数组长度:7 香蕉数量:1 2 2 7 3 6 1 猴子次数:3
  1. 计算香蕉总数:1 + 2 + 2 + 7 + 3 + 6 + 1 = 22
  2. 窗口大小:7 - 3 = 4
  3. 初始化窗口和:1 + 2 + 2 + 7 = 12
  4. 滑动窗口并计算最小窗口和:
    • 窗口[2, 2, 7, 3]和为14,最小和仍为12
    • 窗口[2, 7, 3, 6]和为18,最小和仍为12
    • 窗口[7, 3, 6, 1]和为17,最小和仍为12
  5. 猴子能获取的最大香蕉数:总和 - 最小窗口和 = 22 - 12 = 10

因此,猴子能获取的最大香蕉数为10

C++

#include<iostream>#include<vector>#include<climits>using namespace std;// 计算猴子能获取的最大香蕉数intmaxBananas(constvector<int>&numbers,intN){inttotal=0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(intnumber:numbers){total+=number;}// 如果N等于数组长度,猴子可以拿走所有的香蕉if(N==numbers.size()){returntotal;}intminWindowSum=INT_MAX;// 初始化最小窗口和为最大整数值intcurrentWindowSum=0;// 初始化当前窗口和为0intwindowSize=numbers.size()-N;// 计算窗口大小// 初始化窗口的和for(inti=0;i<windowSize;i++){currentWindowSum+=numbers[i];}minWindowSum=currentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(inti=windowSize;i<numbers.size();i++){// 窗口滑动,加上新进入窗口的元素,减去离开窗口的元素currentWindowSum+=numbers[i]-numbers[i-windowSize];// 更新最小窗口和minWindowSum=min(minWindowSum,currentWindowSum);}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}intmain(){intlen;// 读取数组长度cin>>len;vector<int>numbers(len);// 创建数组存储每串香蕉的数量for(inti=0;i<len;i++){cin>>numbers[i];// 循环读取每串香蕉的数量}intN;// 读取猴子可以获取的次数cin>>N;cout<<maxBananas(numbers,N)<<endl;// 输出猴子能获取的最大香蕉数return0;}

Java

importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);intlen=scanner.nextInt();// 读取数组长度int[]numbers=newint[len];// 创建数组存储每串香蕉的数量for(inti=0;i<len;i++){numbers[i]=scanner.nextInt();// 循环读取每串香蕉的数量}intN=scanner.nextInt();// 读取猴子可以获取的次数System.out.println(maxBananas(numbers,N));// 输出猴子能获取的最大香蕉数}// 定义方法计算猴子能获取的最大香蕉数privatestaticintmaxBananas(int[]numbers,intN){inttotal=0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(intnumber:numbers){total+=number;}// 如果N等于数组长度,猴子可以拿走所有的香蕉if(N==numbers.length){returntotal;}intminWindowSum=Integer.MAX_VALUE;// 初始化最小窗口和为最大整数值intcurrentWindowSum=0;// 初始化当前窗口和为0intwindowSize=numbers.length-N;// 计算窗口大小// 初始化窗口的和for(inti=0;i<windowSize;i++){currentWindowSum+=numbers[i];}minWindowSum=currentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(inti=windowSize;i<numbers.length;i++){// 窗口滑动,加上新进入窗口的元素,减去离开窗口的元素currentWindowSum+=numbers[i]-numbers[i-windowSize];// 更新最小窗口和minWindowSum=Math.min(minWindowSum,currentWindowSum);}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}}

javaScript

// 使用Node.js的readline模块来处理输入constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});// 读取输入rl.on('line',(len)=>{len=parseInt(len);rl.on('line',(numbers)=>{numbers=numbers.split(' ').map(Number);rl.on('line',(N)=>{N=parseInt(N);console.log(maxBananas(numbers,N));// 输出猴子能获取的最大香蕉数rl.close();});});});// 计算猴子能获取的最大香蕉数functionmaxBananas(numbers,N){lettotal=numbers.reduce((acc,val)=>acc+val,0);// 计算数组中所有香蕉的总数if(N===numbers.length){returntotal;// 如果N等于数组长度,猴子可以拿走所有的香蕉}letminWindowSum=Infinity;// 初始化最小窗口和为无穷大letcurrentWindowSum=0;// 初始化当前窗口和为0letwindowSize=numbers.length-N;// 计算窗口大小for(leti=0;i<windowSize;i++){currentWindowSum+=numbers[i];}minWindowSum=currentWindowSum;for(leti=windowSize;i<numbers.length;i++){currentWindowSum+=numbers[i]-numbers[i-windowSize];minWindowSum=Math.min(minWindowSum,currentWindowSum);}returntotal-minWindowSum;// 猴子能获取的最大香蕉数是总和减去最小窗口和}

Python

importsys# 计算猴子能获取的最大香蕉数的函数defmax_bananas(numbers,N):# 计算数组中所有香蕉的总数total=sum(numbers)# 如果N等于数组长度,猴子可以拿走所有的香蕉ifN==len(numbers):returntotal# 初始化最小窗口和为无穷大min_window_sum=float('inf')# 初始化当前窗口和为0current_window_sum=0# 计算窗口大小window_size=len(numbers)-N# 初始化当前窗口的和foriinrange(window_size):current_window_sum+=numbers[i]min_window_sum=current_window_sum# 通过滑动窗口计算最小窗口和foriinrange(window_size,len(numbers)):# 窗口滑动,加上新进入窗口的元素,减去离开窗口的元素current_window_sum+=numbers[i]-numbers[i-window_size]# 更新最小窗口和min_window_sum=min(min_window_sum,current_window_sum)# 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-min_window_sum# 读取数组长度array_length=int(input())# 读取数组,将输入的字符串分割并转换为整数列表numbers=list(map(int,input().strip().split()))# 读取猴子可以获取的次数N=int(input())# 输出猴子能获取的最大香蕉数print(max_bananas(numbers,N))

Go

packagemainimport("fmt""math")funcmain(){varlenintfmt.Scan(&len)// 读取数组长度numbers:=make([]int,len)// 创建数组存储每串香蕉的数量fori:=0;i<len;i++{fmt.Scan(&numbers[i])// 循环读取每串香蕉的数量}varNintfmt.Scan(&N)// 读取猴子可以获取的次数fmt.Println(maxBananas(numbers,N))// 输出猴子能获取的最大香蕉数}// 定义方法计算猴子能获取的最大香蕉数funcmaxBananas(numbers[]int,Nint)int{total:=0// 初始化数组总和为0// 计算数组中所有香蕉的总数for_,number:=rangenumbers{total+=number}// 如果N等于数组长度,猴子可以拿走所有的香蕉ifN==len(numbers){returntotal}minWindowSum:=math.MaxInt32// 初始化最小窗口和为最大整数值currentWindowSum:=0// 初始化当前窗口和为0windowSize:=len(numbers)-N// 计算窗口大小// 初始化窗口的和fori:=0;i<windowSize;i++{currentWindowSum+=numbers[i]}minWindowSum=currentWindowSum// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和fori:=windowSize;i<len(numbers);i++{// 窗口滑动,加上新进入窗口的元素,减去离开窗口的元素currentWindowSum+=numbers[i]-numbers[i-windowSize]// 更新最小窗口和minWindowSum=min(minWindowSum,currentWindowSum)}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum}// 辅助函数:返回两个整数中的较小值funcmin(a,bint)int{ifa<b{returna}returnb}

C语言

#include<stdio.h>#include<limits.h>// 计算猴子能获取的最大香蕉数intmaxBananas(intnumbers[],intlen,intN){inttotal=0;// 初始化数组总和为0// 计算数组中所有香蕉的总数for(inti=0;i<len;i++){total+=numbers[i];}// 如果N等于数组长度,猴子可以拿走所有的香蕉if(N==len){returntotal;}intminWindowSum=INT_MAX;// 初始化最小窗口和为最大整数值intcurrentWindowSum=0;// 初始化当前窗口和为0intwindowSize=len-N;// 计算窗口大小// 初始化窗口的和for(inti=0;i<windowSize;i++){currentWindowSum+=numbers[i];}minWindowSum=currentWindowSum;// 将当前窗口和赋值给最小窗口和// 通过滑动窗口计算最小窗口和for(inti=windowSize;i<len;i++){// 窗口滑动,加上新进入窗口的元素,减去离开窗口的元素currentWindowSum+=numbers[i]-numbers[i-windowSize];// 更新最小窗口和if(currentWindowSum<minWindowSum){minWindowSum=currentWindowSum;}}// 猴子能获取的最大香蕉数是总和减去最小窗口和returntotal-minWindowSum;}intmain(){intlen;// 读取数组长度scanf("%d",&len);intnumbers[len];// 创建数组存储每串香蕉的数量for(inti=0;i<len;i++){scanf("%d",&numbers[i]);// 循环读取每串香蕉的数量}intN;// 读取猴子可以获取的次数scanf("%d",&N);printf("%d\n",maxBananas(numbers,len,N));// 输出猴子能获取的最大香蕉数return0;}

完整用例

用例1

5 2 4 5 1 3 2

用例2

6 1 3 2 5 4 2 3

用例3

4 5 1 2 3 2

用例4

8 3 2 7 1 2 6 4 5 4

用例5

10 1 2 3 4 5 6 7 8 9 10 5

用例6

7 10 20 30 40 50 60 70 3

用例7

3 3 2 1 2

用例8

9 1 3 5 7 9 11 13 15 17 5

用例9

6 6 7 8 1 2 3 4

用例10

5 4 1 2 3 4 3

文章目录

  • 最新华为上机考试
  • 题目描述
  • 输入描述
  • 输出描述
  • 用例
  • 用例2
  • 用例3
  • 题目解析
  • 我们以用例1解释题目:
  • 我们以用例3解释题目:
  • 解题思路
  • 模拟计算过程
  • C++
  • Java
  • javaScript
  • Python
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/19 20:02:39

机械臂工作空间仿真分析-基于蒙特卡洛法的七自由度机械臂

机械臂工作空间仿真分析-6 蒙特卡洛法&#xff0c;七自由度机械臂。蒙特卡洛法玩机械臂就像在工地撒豆子——撒得越多&#xff0c;轮廓越清晰。今天咱们拿七轴机械臂开刀&#xff0c;用Python折腾个工作空间三维点云图。别被自由度吓到&#xff0c;这玩意儿的关键在于敢让随机数…

作者头像 李华
网站建设 2026/6/3 18:00:51

Matlab学习笔记04

书籍&#xff1a;Matlab实用教程 工具&#xff1a;Matlab2021a 电脑信息&#xff1a;Intel Xeon CPU E5-2603 v3 1.60GHz 系统类型&#xff1a;64位操作系统&#xff0c;基于X64的处理器 windows10 专业版 第2章 MATLAB数值计算 2.2.5 多维数组 a(:,:,2)[1 2;3 4] a ans(:,:,1…

作者头像 李华
网站建设 2026/6/3 23:32:33

AI重塑HR全流程:IT人才招聘效率提升90%的实战指南

在数字经济加速渗透的今天&#xff0c;IT 人才已成为企业核心竞争力的关键载体。然而&#xff0c;IT 招聘长期面临 “技术栈匹配难、简历筛选效率低、面试流程冗长、候选人流失率高” 四大痛点&#xff1a;某互联网公司数据显示&#xff0c;传统 IT 招聘中&#xff0c;HR 平均花…

作者头像 李华
网站建设 2026/6/5 20:54:01

Java资源合集

程序员《Java架构师实战训练营 (含完整资料)》 文件大小: 135.3GB内容特色: 135GB大厂级Java架构师全流程实战适用人群: 3年以上Java工程师冲刺架构师核心价值: 源码级落地分布式高并发项目速成下载链接: https://pan.quark.cn/s/49f75756e5e2 北京总部Java241125班_根据课程…

作者头像 李华
网站建设 2026/6/5 18:12:17

【每日算法】LeetCode 51. N 皇后

对前端开发者而言&#xff0c;学习算法绝非为了“炫技”。它是你从“页面构建者”迈向“复杂系统设计者”的关键阶梯。它将你的编码能力从“实现功能”提升到“设计优雅、高效解决方案”的层面。从现在开始&#xff0c;每天投入一小段时间&#xff0c;结合前端场景去理解和练习…

作者头像 李华
网站建设 2026/6/5 12:36:46

用户故事测试验收标准:从需求到质量的精准桥梁

在敏捷软件开发中&#xff0c;用户故事作为需求表达的核心载体&#xff0c;其测试验收标准&#xff08;Acceptance Criteria&#xff09;构成了开发团队、测试人员与产品经理之间的关键契约。根据2024年ISTQB行业调查报告显示&#xff0c;超过67%的软件缺陷源于需求理解不一致&…

作者头像 李华