华为OD机考双机位C卷 - 书籍叠放(Java Python JS C/C++ GO )

最新华为OD机试

真题目录:点击查看目录
华为OD面试真题精选:点击立即查看
华为OD机考双机位C卷 - 书籍叠放

题目描述

书籍的长、宽都是整数对应(l,w)。如果书A的长宽度都比B长宽大时,则允许将B排列放在A上面。

现在有一组规格的书籍,书籍叠放时要求书籍不能做旋转,请计算最多能有多少个规格书籍能叠放在一起。

输入描述

输入:books = [[20,16],[15,11],[10,10],[9,10]]

说明:总共4本书籍,第一本长度为20宽度为16;第二本书长度为15宽度为11,依次类推,最后一本书长度为9宽度为10.

输出描述

输出:3

说明: 最多3个规格的书籍可以叠放到一起, 从下到上依次为: [20,16],[15,11],[10,10]

示例1

输入

[[20,16],[15,11],[10,10],[9,10]]

输出

3

说明

Java

importjava.util.*;publicclassMain{publicstaticvoidmain(String[]args){Scannersc=newScanner(System.in);Stringinput=sc.nextLine();// 去掉字符串的首尾方括号,并按书籍分隔符 "],[" 分割,生成每本书的字符串数组String[]bookStrings=input.substring(1,input.length()-1).split("(?<=]),(?=\\[)");// 定义二维数组存储所有书的长宽信息Integer[][]books=newInteger[bookStrings.length][];// 遍历每本书的字符串,将其转换为长度和宽度的整数数组for(inti=0;i<bookStrings.length;i++){// 去掉当前书的方括号,并按逗号分割String[]bookValues=bookStrings[i].substring(1,bookStrings[i].length()-1).split(",");books[i]=newInteger[bookValues.length];// 将分割后的字符串转换为整数并存入书籍数组for(intj=0;j<bookValues.length;j++){books[i][j]=Integer.parseInt(bookValues[j]);}}// 按照书的长度从小到大排序,如果长度相同,则按宽度从大到小排序Arrays.sort(books,Comparator.comparing((Integer[]arr)->arr[0]).thenComparing((Integer[]arr)->-arr[1]));// 提取所有书籍的宽度,准备计算最长不下降子序列int[]widths=Arrays.stream(books).mapToInt(book->book[1]).toArray();// 定义一个数组用于保存最长不下降子序列(LIS)int[]lis=newint[widths.length];intlen=0;// 用于记录 LIS 的长度// 遍历所有书籍的宽度,使用二分查找优化 LIS 计算for(inti=0;i<widths.length;i++){// 使用二分查找确定宽度插入 LIS 的位置intidx=Arrays.binarySearch(lis,0,len,widths[i]);// 如果找不到合适位置,binarySearch 返回负数,需转换为插入位置if(idx<0){idx=-(idx+1);// 二分查找返回负数时转换为插入位置}// 更新 LIS,若插入位置是当前长度 len 位置,表示找到了新的子序列元素,增加 lenlis[idx]=widths[i];if(idx==len){len++;// 子序列长度增加}}// 输出最长不下降子序列的长度,即最大可以叠放的书籍数量System.out.println(len);}}

Python

importsysimportbisect# 读取用户输入的书籍数据,假设输入形如 [[20,16],[21,15],[22,14]]books=eval(input())# eval 将输入的字符串转化为实际的 Python 数据结构(二维列表)# 对书籍列表按照书的长度从小到大排序,如果长度相同则按照宽度从大到小排序books.sort(key=lambdax:(x[0],-x[1]))# lambda 函数 x[0] 表示按长度排序,x[1] 前面的负号表示宽度按照降序排列# 提取所有书籍的宽度,生成一个列表widths=list(map(lambdax:x[1],books))# 使用 map 提取每本书的宽度并转换为列表# 初始化最长不下降子序列(LIS),首先将第一个宽度值放入 LIS 列表lis=[widths[0]]# 遍历所有书籍的宽度,从第二本书开始foriinrange(1,len(widths)):# 如果当前书的宽度大于 LIS 列表中的最后一个元素,则将其追加到 LIS 中ifwidths[i]>lis[-1]:lis.append(widths[i])# 如果当前书的宽度小于 LIS 列表中的第一个元素,替换第一个元素elifwidths[i]<lis[0]:lis[0]=widths[i]# 否则,使用二分查找找到第一个大于或等于当前宽度的位置,并替换它else:idx=bisect.bisect_left(lis,widths[i])lis[idx]=widths[i]# 输出 LIS 的长度,即可以叠放的最多书籍数量print(len(lis))

JavaScript

constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});rl.on('line',(input)=>{// 按照 "],[" 分割每本书的信息constbooks=input.substring(1,input.length-1).split(/(?<=]),(?=\[)/)// 使用正则表达式分割书本.map(s=>s.substring(1,s.length-1)// 去掉每本书的内部方括号.split(',')// 按逗号分隔长度和宽度.map(Number));// 将字符串转换为数字// 按照书籍的长度从小到大排序,如果长度相同,则按宽度从大到小排序books.sort((a,b)=>a[0]-b[0]||b[1]-a[1]);// 提取书籍的宽度,准备计算最长不下降子序列constwidths=books.map(book=>book[1]);// 初始化 LIS(Longest Increasing Subsequence, 最长不下降子序列)的数组constlis=[widths[0]];// 以第一本书的宽度作为起点// 遍历所有书籍的宽度,从第二本书开始for(leti=1;i<widths.length;i++){// 如果当前书的宽度大于 LIS 的最后一个元素,直接追加到 LIS 中if(widths[i]>lis[lis.length-1]){lis.push(widths[i]);}// 如果当前书的宽度小于 LIS 的第一个元素,替换第一个元素elseif(widths[i]<lis[0]){lis[0]=widths[i];}// 否则,找到 LIS 中第一个大于或等于当前宽度的位置,进行替换else{constidx=lis.findIndex(w=>w>=widths[i]);lis[idx]=widths[i];}}// 输出 LIS 的长度,即最大可以叠放的书籍数量console.log(lis.length);});

C++

#include<iostream>#include<vector>#include<algorithm>using namespace std;intmain(){// 获取用户输入的一行数据string input;getline(cin,input);vector<vector<int>>books;size_tpos=1;// 初始化位置,跳过输入的第一个字符 '['// 解析输入字符串,提取每本书的长和宽while(pos<input.size()-1){// 当遍历到输入的倒数第二个字符时停止size_tend=input.find("],",pos);// 查找每本书的结束位置if(end==string::npos){// 如果没找到 "],", 则说明已经到最后一本书end=input.size()-1;// 将结束位置设置为输入字符串的倒数第一个字符 ']'}// 截取表示一本书的字符串,例如 "[20,16]"string book_str=input.substr(pos,end-pos+1);pos=end+2;// 更新 pos,跳过 "],"vector<int>book;size_tbook_pos=1;// 初始化为1,跳过书字符串的第一个字符 '['// 解析书的长度和宽度while(book_pos<book_str.size()-1){size_tbook_end=book_str.find(",",book_pos);// 找到书的宽度与长度的分隔符 ","if(book_end==string::npos){// 如果没找到分隔符,则表示当前数字是宽度book_end=book_str.size()-1;}// 提取长度或宽度的数字字符串,并将其转换为整数string num_str=book_str.substr(book_pos,book_end-book_pos);book_pos=book_end+1;// 更新位置,跳过逗号 ","book.push_back(stoi(num_str));// 将数字添加到书的向量中}// 将解析出的书的长宽向量添加到 books 数组中books.push_back(book);}// 对书籍进行排序// 先按照长度升序排序,如果长度相同,则按宽度降序排列sort(books.begin(),books.end(),[](vector<int>&a,vector<int>&b){returna[0]==b[0]?b[1]<a[1]:a[0]<b[0];// 如果长度相等,按宽度降序排列});// 提取所有书的宽度,方便之后寻找最长不下降子序列vector<int>widths;for(vector<int>&book:books){widths.push_back(book[1]);// 仅保留每本书的宽度}// 寻找宽度的最长不下降子序列(LIS),使用二分查找优化vector<int>lis;intlen=0;// 记录最长子序列的长度for(inti=0;i<widths.size();i++){// 找到当前宽度应该插入的位置,保持宽度不下降intidx=lower_bound(lis.begin(),lis.end(),widths[i])-lis.begin();if(idx==len){// 如果插入的位置等于当前 LIS 的长度,说明找到了一个新的更大的宽度,直接添加lis.push_back(widths[i]);len++;// 增加最长子序列的长度}else{// 否则,用当前宽度替换掉对应位置的值,以保持 LIS 的最小值lis[idx]=widths[i];}}// 输出最长不下降子序列的长度,也就是最多可以叠放的书籍数量cout<<len<<endl;return0;}

Go

packagemainimport("bufio""encoding/json""fmt""os""sort""strings")funcmain(){// 使用 bufio 读取整行输入scanner:=bufio.NewScanner(os.Stdin)// 设置较大的缓冲区以防止输入过长constmaxCapacity=1024*1024buf:=make([]byte,maxCapacity)scanner.Buffer(buf,maxCapacity)ifscanner.Scan(){input:=scanner.Text()input=strings.TrimSpace(input)ifinput==""{return}// 1. 解析输入// 输入格式如 [[10,20],[15,10]] 符合 JSON 格式,直接反序列化最为高效且健壮varbooks[][]interr:=json.Unmarshal([]byte(input),&books)iferr!=nil{// 如果输入不完全符合 JSON 标准(例如非常规的空格或格式),// 这里需要根据实际情况添加错误处理或手动解析逻辑fmt.Fprintln(os.Stderr,"输入格式解析错误:",err)return}// 2. 排序// 按照书的长度(index 0)从小到大排序// 如果长度相同,则按宽度(index 1)从大到小排序sort.Slice(books,func(i,jint)bool{ifbooks[i][0]==books[j][0]{returnbooks[i][1]>books[j][1]// 宽度降序}returnbooks[i][0]<books[j][0]// 长度升序})// 3. 提取宽度并计算最长不下降子序列 (LIS)// 实际上由于排序策略(长度同则宽度降序),这里是在求宽度的“最长严格递增子序列”// 对应 LeetCode 354. Russian Doll Envelopes 问题widths:=make([]int,len(books))fori,book:=rangebooks{widths[i]=book[1]}// lis 数组用于存储递增子序列的尾部元素// lis[i] 表示长度为 i+1 的递增子序列的最小尾部值lis:=make([]int,len(widths))length:=0// 记录当前 LIS 的长度for_,w:=rangewidths{// 使用二分查找寻找 w 应该插入的位置// sort.Search 返回第一个满足 lis[i] >= w 的下标 i// 这等同于 Java 代码中查找并处理负数返回值的逻辑idx:=sort.Search(length,func(iint)bool{returnlis[i]>=w})// 更新 LIS 数组lis[idx]=w// 如果插入位置等于当前长度,说明我们扩展了最长子序列ifidx==length{length++}}// 4. 输出结果fmt.Println(length)}}

C语言

#include<stdio.h>#include<stdlib.h>#include<string.h>// 用于书籍存储的结构体,每本书包含长度和宽度typedefstruct{intlength;intwidth;}Book;// 比较函数,用于 qsort 排序书籍// 先按长度升序,如果长度相同则按宽度降序intcompare(constvoid*a,constvoid*b){Book*bookA=(Book*)a;Book*bookB=(Book*)b;if(bookA->length==bookB->length){returnbookB->width-bookA->width;// 宽度降序}returnbookA->length-bookB->length;// 长度升序}// 二分查找优化,寻找插入点intlower_bound(int*lis,intlen,inttarget){intleft=0,right=len;while(left<right){intmid=(left+right)/2;if(lis[mid]<target){left=mid+1;}else{right=mid;}}returnleft;}intmain(){// 获取用户输入的一行数据charinput[1000];// 假设输入不会超过1000字符fgets(input,sizeof(input),stdin);Book books[100];// 假设最多有100本书intbookCount=0;// 记录书的数量char*pos=input+1;// 跳过输入的第一个字符 '['// 解析输入字符串,提取每本书的长和宽while(*pos!=']'){// 当遇到输入的倒数第二个字符停止intlength,width;sscanf(pos,"[%d,%d]",&length,&width);// 解析出一本书的长和宽books[bookCount].length=length;books[bookCount].width=width;bookCount++;// 移动到下一本书的位置,跳过当前的 "],"pos=strstr(pos,"],");if(pos){pos+=2;// 跳过 "],"}else{break;// 到达最后一本书}}// 对书籍进行排序,先按长度升序,如果长度相同则按宽度降序qsort(books,bookCount,sizeof(Book),compare);// 提取所有书的宽度,方便之后寻找最长不下降子序列intwidths[100];// 宽度数组for(inti=0;i<bookCount;i++){widths[i]=books[i].width;}// 寻找宽度的最长不下降子序列(LIS),使用二分查找优化intlis[100];// LIS 数组intlen=0;// 记录最长子序列的长度for(inti=0;i<bookCount;i++){// 找到当前宽度应该插入的位置,保持宽度不下降intidx=lower_bound(lis,len,widths[i]);if(idx==len){// 如果插入位置等于当前 LIS 的长度,说明找到了一个新的更大的宽度lis[len++]=widths[i];}else{// 否则,用当前宽度替换掉对应位置的值,以保持 LIS 的最小值lis[idx]=widths[i];}}// 输出最长不下降子序列的长度,也就是最多可以叠放的书籍数量printf("%d\n",len);return0;}

完整用例

用例1

[[1,1],[2,2],[3,3],[4,4]]

用例2

[[1,1],[2,2],[2,2],[3,3]]

用例3

[[1,1],[2,2],[2,2],[2,2]]

用例4

[[1,1],[2,2],[3,3],[1,2]]

用例5

[[1,1],[2,2],[3,3],[2,1]]

用例6

[[20,16],[15,11],[10,10],[9,10],[8,8],[7,7],[6,6],[5,5],[4,4],[3,3],[2,2],[1,1]]

用例7

[[20,16],[15,11],[10,10],[9,10],[8,8],[7,7],[6,6],[5,5],[4,4],[3,3],[2,2],[2,2]]

用例8

[[20,16],[15,11],[10,10],[9,10],[8,8],[7,7],[6,6],[5,5],[4,4],[4,4],[4,4],[4,4]]

用例9

[[20,16],[15,11],[10,10],[9,10],[8,8],[7,7],[6,6],[5,5],[5,5],[5,5],[5,5],[5,5]]

用例10

[[20,16],[15,11],[10,10],[9,10],[8,8],[7,7],[6,6],[6,6],[6,6],[6,6],[6,6],[6,6]]

文章目录

  • 最新华为OD机试
  • 题目描述
  • 输入描述
  • 输出描述
  • 示例1
  • Java
  • Python
  • JavaScript
  • C++
  • Go
  • C语言
  • 完整用例
    • 用例1
    • 用例2
    • 用例3
    • 用例4
    • 用例5
    • 用例6
    • 用例7
    • 用例8
    • 用例9
    • 用例10

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

算法题 按奇偶排序数组 II

922. 按奇偶排序数组 II 问题描述 给定一个非负整数数组 nums&#xff0c;其中一半整数是奇数&#xff0c;另一半是偶数。 你需要对数组进行重排序&#xff0c;使得对于所有偶数索引 i&#xff0c;nums[i] 是偶数&#xff1b;对于所有奇数索引 i&#xff0c;nums[i] 是奇数。 返…

计算机毕业设计springboot博物馆藏品管理系统 基于SpringBoot的文博资产数字化运营平台 SpringBoot驱动的博物馆珍藏智慧管护系统

计算机毕业设计springboot博物馆藏品管理系统 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当库房里的宋瓷、青铜、书画越积越多&#xff0c;纸质台账却开始“掉链子”&#x…

鸿蒙ArkTS开发实战-从零打造高可用待办事项App【QuickTodo】

鸿蒙ArkTS开发实战&#xff1a;从零打造高可用待办事项App【QuickTodo】 随着鸿蒙生态的迅速发展&#xff0c;越来越多的开发者开始关注鸿蒙设备的应用开发。在这一背景下&#xff0c;ArkTS成为鸿蒙应用开发的首选语言&#xff0c;其声明式UI、强类型校验以及跨设备适配能力&a…

计算机毕业设计springboot博物馆预约管理系统 基于SpringBoot的文博场馆分时预约平台 SpringBoot驱动的智慧博物馆访客预约与票务系统

计算机毕业设计springboot博物馆预约管理系统 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。当“排队两小时&#xff0c;看展十分钟”成为常态&#xff0c;博物馆门口的长龙不仅…

深度调优:在 GNN 涡轮风扇发动机寿命预测中,学习率调度器如何决定模型生死?

前言&#xff1a;为什么学习率是 RUL 预测的“脉搏”&#xff1f; 在处理 NASA C-MAPSS 这样复杂的时间序列空间图结构数据时&#xff0c;我们通常会构建复杂的模型&#xff08;如时空图卷积网络 ST-GCN 或图注意力网络 GAT&#xff09;。然而&#xff0c;即使你有最完美的模型…

大数据领域中 Eureka 的服务注册与发现的容灾备份方案

大数据领域中 Eureka 的服务注册与发现的容灾备份方案关键词&#xff1a;大数据、Eureka、服务注册与发现、容灾备份方案、高可用性摘要&#xff1a;在大数据领域&#xff0c;服务的注册与发现是构建分布式系统的关键环节&#xff0c;Eureka 作为 Netflix 开源的服务注册与发现…

某程旅行小程序爬虫技术解析与实战案例

一、小程序爬虫核心技术认知 1. 小程序与传统 Web 爬虫的核心差异 传统 Web 爬虫主要针对 PC 端或移动端网页&#xff0c;基于 HTML 解析、Cookie 维持、HTTP/HTTPS 请求模拟即可完成大部分数据抓取工作。而小程序爬虫的核心差异体现在三个方面&#xff1a; 传输协议与数据格式…

当代人 “最放不下的前任”

1️⃣ 明明知道吃了胖&#xff0c;却还是忍不住想点那家外卖&#x1f35f;2️⃣ 一直深信能自律&#xff0c;是我做过最自欺欺人的事⏰3️⃣ 嘴上说着要省钱&#xff0c;手却诚实点开购物车&#x1f6d2;4️⃣ 别人问起熬不熬夜&#xff0c;我总说早就早睡&#xff0c;其实在刷…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘torchaudio’ 问题

摘要 本文聚焦pip install安装torchaudio后&#xff08;或导入torchaudio时&#xff09;出现的ModuleNotFoundError: No module named torchaudio报错&#xff0c;该问题核心是Python解释器在当前运行环境的模块查找路径&#xff08;sys.path&#xff09;中找不到torchaudio模…

算法题 和相同的二元子数组

930. 和相同的二元子数组 问题描述 给你一个二元数组 nums 和一个整数 goal&#xff0c;请你统计并返回有多少个非空连续子数组的和等于 goal。 示例&#xff1a; 输入: nums [1,0,1,0,1], goal 2 输出: 4 解释: 有4个满足要求的子数组: [1,0,1], [1,0,1,0], [0,1,0,1], [1,0…

【毕业设计】基于深度学习卷积神经网络天上飞的识别基于python-CNN深度学习卷积神经网络天上飞的识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

计算机毕业设计springboot财务管理系统 基于SpringBoot的企业财务一体化运营平台 SpringBoot驱动的智能记账与资金管控系统

计算机毕业设计springboot财务管理系统&#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。手工做账、Excel满天飞、审批靠签字&#xff0c;月底关账夜夜通宵&#xff1f;把凭证、发票…

AI学习笔记整理(45)——大模型数据读取技术与模型部署

数据读取技术 大模型中的数据读取技术涉及从多样化数据源高效获取和加载数据&#xff0c;是模型训练与推理的基础环节。以下从数据源类型、关键技术方法及工具实践等方面进行说明。 ‌数据源类型与采集方法&#xff1a;‌ 大模型训练数据主要来源于结构化与非结构化数据源。结…

计算机深度学习毕设实战-基于python-CNN机器学习卷积神经网络对蔬菜识别基于python-CNN卷积神经网络对蔬菜识别

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

江苏硕晟LIMS:全力响应资质认定政策,打造生态环境监测信息管理典范

政策背景与核心要求当下&#xff0c;生态环境监测作为生态治理的核心支撑&#xff0c;其重要性愈发凸显。检验检测机构资质认定生态环境监测机构知识库所提出的各项要求&#xff0c;已成为规范行业发展、保障监测质量的关键准则&#xff0c;其中第十七条更是针对监测机构使用信…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘torchvision’ 问题

摘要 本文聚焦pip install安装torchvision后&#xff08;或导入torchvision时&#xff09;出现的ModuleNotFoundError: No module named torchvision报错&#xff0c;该问题核心是Python解释器在当前运行环境的模块查找路径&#xff08;sys.path&#xff09;中找不到torchvisi…

企业防泄密软件都有哪些?这六款防泄密软件帮您解决泄密难题!

企业电脑终端藏着半壁江山的核心资产 —— 客户资料、研发方案、商业机密全在这&#xff0c;可员工摸鱼低效、文件随意外传的风险也如影随形。选对监控软件能少走太多弯路&#xff01;2026 实测 6 款高适配工具&#xff0c;既解决员工管理难题&#xff0c;又筑牢数据安全防线&a…

借助AI智能技术,十大专业降重网站提供免费试用服务,帮助用户快速完成文本改写任务

排名 工具名称 降重效率 特色功能 适用场景 免费额度 1 aibiye ⭐⭐⭐⭐⭐ AIGC查重降重双功能 学术论文深度优化 首次免费检测 2 aicheck ⭐⭐⭐⭐ 多维度重复率分析 日常作业/论文初稿 每日3000字免费 3 笔启AI ⭐⭐⭐⭐ 长文记忆多语种支持 硕博论文/…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘torch’ 问题

摘要 本文聚焦pip install安装torch&#xff08;PyTorch&#xff09;后&#xff08;或导入torch时&#xff09;出现的ModuleNotFoundError: No module named torch报错&#xff0c;该问题核心是Python解释器在当前运行环境的模块查找路径&#xff08;sys.path&#xff09;中找…

Python系列Bug修复|如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘torch’ 问题

摘要 本文聚焦pip install安装torch&#xff08;PyTorch&#xff09;后&#xff08;或导入torch时&#xff09;出现的ModuleNotFoundError: No module named torch报错&#xff0c;该问题核心是Python解释器在当前运行环境的模块查找路径&#xff08;sys.path&#xff09;中找…