news 2026/5/11 9:25:50

华为OD新系统机试真题 2026.5.10 - 美观的灯笼

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
华为OD新系统机试真题 2026.5.10 - 美观的灯笼

美观的灯笼(Py/Java/C/C++/Js/Go)题解

华为OD新系统机试真题 华为OD新系统上机考试真题 5月10号 100分题型

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

题目描述

春节将至,工人要在古镇老街挂灯笼。街上有N NN个挂灯点,每个点因建筑结构不同,工人挂上的灯笼的尺寸M也不同(数值越大表示灯笼越大)。
工人认为美观的灯笼必须按非递增尺寸顺序挂置,即后续灯笼尺寸不能超过当前灯笼(只能相同或更小)。
工人完成灯笼挂接后,需要你代替他判断:
1、这排灯笼里,满足美观定义的最长连续灯笼区域有多少个灯笼;
2、这段最长连续区域是从哪个挂灯点开始?(当存在多个最长连续区域时选择最左边的挂灯点)

输入描述

N NN个正整数M ( 1 ≤ M ≤ 100 ) M(1 \le M \le 100)M1M100,表示每个挂灯点所挂的灯笼尺寸。

输出描述

输出两个整数:第一个是符合题意的灯笼数,第二个是开始挂灯笼的挂灯点位置(从0 00开始计数)。

样例1

输入

5,3,4,4,2,1

输出

4,2

说明

灯笼尺寸序列为[ 5 , 3 , 4 , 4 , 2 , 1 ] [5,3,4,4,2,1][5,3,4,4,2,1]。存在长度为4 44的非递增连续子序列:[ 4 , 4 , 2 , 1 ] [4,4,2,1][4,4,2,1](位置2 − 5 2-525)。

样例2

输入

5,4,3,2,1

输出

5,0

说明

灯笼尺寸序列为[ 5 , 4 , 3 , 2 , 1 ] [5,4,3,2,1][5,4,3,2,1]。整个序列满足非递增要求,长度为5 55,起始位置为0 00

样例3

输入

2,2,2,2

输出

4,0

说明

灯笼尺寸序列为[ 2 , 2 , 2 , 2 ] [2,2,2,2][2,2,2,2]。所有灯笼尺寸相等,满足非递增要求,长度为4 44,起始位置为0 00

题解

思路:模拟

  1. 非递增就是后一个尺寸不能大于前一个尺寸,满足nums[i] <= nums[i-1]即可。并且题目要求找连续非递增区域。
  2. 基于1的分析,按照下面逻辑实现
    • 定义bestBeginbestLen记录最好的开始点和最好的长度,定义curLencurBegin记录当前连续区域的长度和开始点。
    • 从前往后扫描数据,当扫描到位置i时:
      • 如果nums[i] > nums[i-1], 非递增终端,更新curLen=i,curBegin=i
      • 如果nums[i] >= nums[i-1],更新curLen += 1
      • 每轮结束之后,判断curLen是否大于bestLen, 满足条件更新bestLen = curLen, bestBegin = curBegin
  3. 按照2的逻辑处理之后,返回对应的bestLenbestBegin即可。

c++

#include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> #include<cmath> #include<map> using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vector<int> split(const string& str, const string& delimiter) { vector<int> result; size_t start = 0; size_t end = str.find(delimiter); while (end != string::npos) { result.push_back(stoi(str.substr(start, end - start))); start = end + delimiter.length(); end = str.find(delimiter, start); } // 添加最后一个部分 result.push_back(stoi(str.substr(start))); return result; } vector<int> findLongLanterns(vector<int>& nums) { // 输入为空 if (nums.empty()) { return {0, 0}; } // 最好的开始点和最好的长度 int bestBegin = -1; int bestLen = 0; // 当前开始点和当前长度 int curLen = 1; int curBegin = 0; for (int i = 1; i < nums.size(); i++) { // 重置起点和长度 if (nums[i] > nums[i-1]) { curLen = 1; curBegin = i; } else { curLen++; } // 大于才更新,等于情况下之前的起点肯定小于当前 if (curLen > bestLen) { bestLen = curLen; bestBegin = curBegin; } } return {bestLen, bestBegin}; } int main() { string input; getline(cin, input); vector<int> nums = split(input, ","); vector<int> res = findLongLanterns(nums); // 输出结果 cout << res[0] << "," << res[1]; return 0; }

JAVA

import java.util.*; public class Main { public static int[] findLongLanterns(int[] nums) { // 输入为空 if (nums.length == 0) { return new int[]{0, 0}; } // 最好的开始点和最好的长度 int bestBegin = -1; int bestLen = 0; // 当前开始点和当前长度 int curLen = 1; int curBegin = 0; for (int i = 1; i < nums.length; i++) { // 重置起点和长度 if (nums[i] > nums[i - 1]) { curLen = 1; curBegin = i; } else { curLen++; } // 大于才更新,等于情况下之前的起点肯定小于当前 if (curLen > bestLen) { bestLen = curLen; bestBegin = curBegin; } } return new int[]{bestLen, bestBegin}; } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); String[] arr = input.split(","); int[] nums = new int[arr.length]; for (int i = 0; i < arr.length; i++) { nums[i] = Integer.parseInt(arr[i]); } int[] res = findLongLanterns(nums); // 输出结果 System.out.println(res[0] + "," + res[1]); } }

Python

deffind_long_lanterns(nums):# 输入为空ifnotnums:return[0,0]# 最好的开始点和最好的长度best_begin=-1best_len=0# 当前开始点和当前长度cur_len=1cur_begin=0foriinrange(1,len(nums)):# 重置起点和长度ifnums[i]>nums[i-1]:cur_len=1cur_begin=ielse:cur_len+=1# 大于才更新,等于情况下之前的起点肯定小于当前ifcur_len>best_len:best_len=cur_len best_begin=cur_beginreturn[best_len,best_begin]defmain():input_str=input()nums=list(map(int,input_str.split(",")))res=find_long_lanterns(nums)# 输出结果print(f"{res[0]},{res[1]}")main()

JavaScript

functionfindLongLanterns(nums){// 输入为空if(nums.length===0){return[0,0];}// 最好的开始点和最好的长度letbestBegin=-1;letbestLen=0;// 当前开始点和当前长度letcurLen=1;letcurBegin=0;for(leti=1;i<nums.length;i++){// 重置起点和长度if(nums[i]>nums[i-1]){curLen=1;curBegin=i;}else{curLen++;}// 大于才更新,等于情况下之前的起点肯定小于当前if(curLen>bestLen){bestLen=curLen;bestBegin=curBegin;}}return[bestLen,bestBegin];}constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});letinput=[];rl.on("line",function(line){input.push(line);});rl.on("close",function(){constnums=input[0].split(",").map(Number);constres=findLongLanterns(nums);// 输出结果console.log(res[0]+","+res[1]);});

Go

packagemainimport("bufio""fmt""os""strconv""strings")funcfindLongLanterns(nums[]int)[]int{// 输入为空iflen(nums)==0{return[]int{0,0}}// 最好的开始点和最好的长度bestBegin:=-1bestLen:=0// 当前开始点和当前长度curLen:=1curBegin:=0fori:=1;i<len(nums);i++{// 重置起点和长度ifnums[i]>nums[i-1]{curLen=1curBegin=i}else{curLen++}// 大于才更新,等于情况下之前的起点肯定小于当前ifcurLen>bestLen{bestLen=curLen bestBegin=curBegin}}return[]int{bestLen,bestBegin}}funcmain(){reader:=bufio.NewReader(os.Stdin)input,_:=reader.ReadString('\n')input=strings.TrimSpace(input)arr:=strings.Split(input,",")nums:=make([]int,len(arr))fori:=0;i<len(arr);i++{nums[i],_=strconv.Atoi(arr[i])}res:=findLongLanterns(nums)// 输出结果fmt.Printf("%d,%d\n",res[0],res[1])}

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAXN100005// 查找结果voidfindLongLanterns(intnums[],intn,int*bestLen,int*bestBegin){// 输入为空if(n==0){*bestLen=0;*bestBegin=0;return;}// 最好的开始点和最好的长度*bestBegin=-1;*bestLen=0;// 当前开始点和当前长度intcurLen=1;intcurBegin=0;for(inti=1;i<n;i++){// 重置起点和长度if(nums[i]>nums[i-1]){curLen=1;curBegin=i;}else{curLen++;}// 大于才更新,等于情况下之前的起点肯定小于当前if(curLen>*bestLen){*bestLen=curLen;*bestBegin=curBegin;}}}intmain(){charinput[MAXN];scanf("%s",input);intnums[MAXN];intn=0;// 使用 strtok 分割字符串char*token=strtok(input,",");while(token!=NULL){nums[n++]=atoi(token);token=strtok(NULL,",");}intbestLen,bestBegin;findLongLanterns(nums,n,&bestLen,&bestBegin);// 输出结果printf("%d,%d\n",bestLen,bestBegin);return0;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/11 9:25:31

穿透 MQ 专栏 (三):【幂等防御】“网卡了一下,用户被扣了两次钱?”:如何防住防不胜防的重复消费

在上一篇&#xff0c;为了防住“薛定谔的消息”&#xff0c;我们在生产者、MQ 服务端和消费者身上绑上了“生死契约”&#xff08;手动 ACK、副本落盘、无限重试&#xff09;。看着坚不可摧的消息防线&#xff0c;你终于睡了个安稳觉。但就在第二天凌晨&#xff0c;客服主管再次…

作者头像 李华
网站建设 2026/5/11 9:24:36

如何免费获得专业音质:Equalizer APO音频均衡器完整教程

如何免费获得专业音质&#xff1a;Equalizer APO音频均衡器完整教程 【免费下载链接】equalizerapo Equalizer APO mirror 项目地址: https://gitcode.com/gh_mirrors/eq/equalizerapo Equalizer APO是一款功能强大的免费开源系统级音频均衡器软件&#xff0c;能够实时处…

作者头像 李华
网站建设 2026/5/11 9:21:39

Structured Output工程2026:让LLM稳定输出JSON的完整实战指南

让LLM输出合法JSON听起来简单&#xff0c;实际生产中却是无数Bug的来源。本文系统梳理结构化输出的所有主流方案&#xff0c;从基础技巧到生产级实现&#xff0c;帮你彻底解决LLM输出不稳定的问题。一、为什么结构化输出如此重要在AI应用开发中&#xff0c;LLM的输出通常需要被…

作者头像 李华
网站建设 2026/5/11 9:21:38

ncmdump终极指南:快速解锁网易云音乐NCM加密文件的完整解决方案

ncmdump终极指南&#xff1a;快速解锁网易云音乐NCM加密文件的完整解决方案 【免费下载链接】ncmdump ncmdump - 网易云音乐NCM转换 项目地址: https://gitcode.com/gh_mirrors/ncmdu/ncmdump 当你下载了网易云音乐的付费歌曲&#xff0c;却发现只能在特定播放器里收听&…

作者头像 李华
网站建设 2026/5/11 9:21:36

【2026实测】直击Turnitin算法:英文论文AI率97%降至8%的4种高效方法

大家最近都在为英文降aigc率发愁吧&#xff0c;作为研三党&#xff0c;我太懂这种痛了&#xff0c;之前我自己写英文初稿&#xff0c;写完直接拿去查重&#xff0c;结果turnitin检测ai率飙到了89%&#xff0c;当时看着报告整个人都懵了。 怎么给英文降ai&#xff1f;对于非母语…

作者头像 李华
网站建设 2026/5/11 9:21:35

从暴力到优雅:LeetCode 3. 无重复字符的最长子串 深度解析

&#x1f4cc; 前言&#xff1a;为什么它是面试之王&#xff1f;在 LeetCode 的“Hot 100”榜单中&#xff0c;第 3 题《无重复字符的最长子串》​ 绝对是面试界的“钉子户”。这道题看似简单&#xff0c;实则考察了&#xff1a;双指针思想&#xff08;滑动窗口的本质&#xff…

作者头像 李华