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

华为OD机试真题 新系统 2026-5-13 多语言实现【查找能被整除的最大整数】

查找能被整除的最大整数(Py/Java /C/C++/Js/Go)题解

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

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

题目内容

给定一个字符串和一个正整数,字符串由大小写字母和数字组成,要求从字符串中找出最大能被给定正整数整除的数。

输入描述

  • s t r i n g stringstringi n p u t S t r inputStrinputStr// 第一个字符串
  • i n t intinti n p u t D i v i s o r inputDivisorinputDivisor// 第二个正整数

输出描述

i n t intintr e s u l t resultresult// 返回结果值
:

  1. 给定的i n p u t S t r inputStrinputStr字符串长度为1 11~10000 1000010000,给定的i n p u t D i v i s o r inputDivisorinputDivisor值的范围为1 11~99 9999;
  2. i n p u t S t r inputStrinputStr中解析的整数不可分割,支持前缀为0 00整数串,数值范围为0 00~999 999999,例如:
    (1) “29 a b 03 29ab0329ab03”、“29 a b 003 29ab00329ab003”、“29 a b 0003 29ab000329ab0003”、“29 a b 00003 29ab0000329ab00003”、"29 a b 000003 29ab00000329ab000003"等3 33前面有前缀0 00的数字串,解析出整数为29 29293 33;
    (2) “0 a b c 123 0abc1230abc123”、“00 a b c 123 00abc12300abc123”、“000 a b c 123 000abc123000abc123”、“0000 a b c 123 0000abc1230000abc123”、“00000 a b c 123 00000abc12300000abc123” 等含一个或多个0 00的数字串,解析出整数为0 00123 123123
  3. 如果输入都合法且能找到能被整除的最大数,则输出该最大数; 其他情况输出− 1 -11,例如: (1) 输入数据包含非法字符、值超出范围、长度超出范围等; (2) 没有找到能被i n p u t D i v i s o r inputDivisorinputDivisor整除的数。

补充说明:

  1. 程序运行内存要小于256 M B 256MB256MB;
  2. 程序运行耗时不能超过1 11秒。

样例1

输入

abc123EFEDG34aadD78er 2

输出

78

说明

34 343478 7878都能被2 22整除,78 7878为能被整除的最大数。

样例2

输入

wrwqr1.0we+de- 3

输出

-1

说明

参数1 11字符串中包含非法字符. + − . + -.+

样例3

输入

ewr23hk064ASW12VBG 4

输出

64

说明

获取的整数列表为23 、 64 、 12 23、64、12236412,能被4 44整除的最大数为64 6464

样例4

输入

ewr23hk064ASW12VBG 5

输出

-1

说明

获取的整数列表为23 、 64 、 12 23、64、12236412,都不能被5整除

样例5

输入

wrq45ret0eww237ere 7

输出

0

说明

只有0 00能被7 77整除

样例6

输入

aaa2222bb66 2

输出

-1

说明

第一个参数中存在大于999 999999的整数,参数不合法。

题解

思路:模拟

  1. 首先判断输入字符串的长度被除数是否处于合法范围内,不属于合法范围直接返回-1.
  2. 从前往后输入字符串,尝试提取其中的数值,具体逻辑如下:
    • 当前遍历为大小写字母时,直接跳过。
    • 当前遍历为数字字符时,尝试获取后序连续数字字符,提取出对应数值。当提取出数值超过999时,说明输入非法,直接返回-1。合法情况下,判断当前数值是否能整除div,能整除情况下,尝试更新最大结果。
    • 当前遍历非字母或数字字符时,说明输入非法,直接返回-1
  3. 按找2的逻辑进行处理,输出对应结果即可。

c++

#include <cctype> #include<iostream> #include<vector> #include<string> #include <utility> #include <sstream> #include<algorithm> using namespace std; int findMaxValue(string& str, int div) { int n = str.size(); // 长度不符合要求 if (n <= 0 || n > 10000) { return -1; } // 被除数不符合要求 if (div < 1 || div > 99) { return -1; } int anwer = -1; int i = 0; while (i < n) { char c = str[i]; //不是字母也不是数字 if (!isdigit(c) && !isalpha(c)) { return -1; } // 非数字直接跳过 if (!isdigit(c)) { i++; continue; } // 提取连续数字字符 int j = i; int value = 0; while (j < n && isdigit(str[j])) { // 忽略前导零 if (value == 0 && str[j] == '0') { j++; continue; } value = value * 10 + (str[j] - '0'); // 出现大于999的值 if (value > 999) { return -1; } j++; } // 此时为提取出来的合法数组 if (value % div == 0) { anwer = max(anwer, value); } i = j; } return anwer; } int main() { string str; int div; getline(cin, str); cin >> div; int res = findMaxValue(str, div); cout << res; return 0; }

JAVA

import java.util.*; public class Main { public static int findMaxValue(String str, int div) { int n = str.length(); // 长度不符合要求 if (n <= 0 || n > 10000) { return -1; } // 被除数不符合要求 if (div < 1 || div > 99) { return -1; } int answer = -1; int i = 0; while (i < n) { char c = str.charAt(i); // 不是字母也不是数字 if (!Character.isDigit(c) && !Character.isLetter(c)) { return -1; } // 非数字直接跳过 if (!Character.isDigit(c)) { i++; continue; } // 提取连续数字字符 int j = i; int value = 0; while (j < n && Character.isDigit(str.charAt(j))) { char d = str.charAt(j); // 忽略前导零 if (value == 0 && d == '0') { j++; continue; } value = value * 10 + (d - '0'); // 出现大于999的值 if (value > 999) { return -1; } j++; } // 此时为提取出来的合法数字 if (value % div == 0) { answer = Math.max(answer, value); } i = j; } return answer; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); int div = sc.nextInt(); System.out.print(findMaxValue(str, div)); } }

Python

importsysdeffindMaxValue(str,div):n=len(str)# 长度不符合要求ifn<=0orn>10000:return-1# 被除数不符合要求ifdiv<1ordiv>99:return-1answer=-1i=0whilei<n:c=str[i]# 不是字母也不是数字ifnotc.isdigit()andnotc.isalpha():return-1# 非数字直接跳过ifnotc.isdigit():i+=1continue# 提取连续数字字符j=i value=0whilej<nandstr[j].isdigit():d=str[j]# 忽略前导零ifvalue==0andd=='0':j+=1continuevalue=value*10+int(d)# 出现大于999的值ifvalue>999:return-1j+=1# 此时为提取出来的合法数字ifvalue%div==0:answer=max(answer,value)i=jreturnanswerif__name__=="__main__":str=sys.stdin.readline().strip()div=int(sys.stdin.readline().strip())print(findMaxValue(str,div))

JavaScript

constreadline=require("readline");constrl=readline.createInterface({input:process.stdin,output:process.stdout});constinput=[];rl.on("line",(line)=>{input.push(line.trim());});rl.on("close",()=>{conststr=input[0]||"";constdiv=Number(input[1]);console.log(findMaxValue(str,div));});functionfindMaxValue(str,div){constn=str.length;// 长度不符合要求if(n<=0||n>10000){return-1;}// 被除数不符合要求if(div<1||div>99){return-1;}letanswer=-1;leti=0;while(i<n){constc=str[i];// 不是字母也不是数字if(!/[a-zA-Z0-9]/.test(c)){return-1;}// 非数字直接跳过if(!/\d/.test(c)){i++;continue;}// 提取连续数字字符letj=i;letvalue=0;while(j<n&&/\d/.test(str[j])){constd=str[j];// 忽略前导零if(value===0&&d==='0'){j++;continue;}value=value*10+Number(d);// 出现大于999的值if(value>999){return-1;}j++;}// 此时为提取出来的合法数字if(value%div===0){answer=Math.max(answer,value);}i=j;}returnanswer;}

Go

packagemainimport("bufio""fmt""os""strconv""unicode")funcfindMaxValue(strstring,divint)int{n:=len(str)// 长度不符合要求ifn<=0||n>10000{return-1}// 被除数不符合要求ifdiv<1||div>99{return-1}answer:=-1i:=0fori<n{c:=rune(str[i])// 不是字母也不是数字if!unicode.IsLetter(c)&&!unicode.IsDigit(c){return-1}// 非数字直接跳过if!unicode.IsDigit(c){i++continue}// 提取连续数字字符j:=i value:=0forj<n&&unicode.IsDigit(rune(str[j])){d:=str[j]// 忽略前导零ifvalue==0&&d=='0'{j++continue}value=value*10+int(d-'0')// 出现大于999的值ifvalue>999{return-1}j++}// 合法数字ifvalue%div==0{ifvalue>answer{answer=value}}i=j}returnanswer}funcmain(){reader:=bufio.NewReaderSize(os.Stdin,1024*1024)// 读取第一行str,_:=reader.ReadString('\n')// 去掉换行iflen(str)>0&&str[len(str)-1]=='\n'{str=str[:len(str)-1]}vardivStrstringfmt.Fscan(reader,&divStr)div,_:=strconv.Atoi(divStr)fmt.Println(findMaxValue(str,div))}

C语言

#include<stdio.h>#include<string.h>#include<ctype.h>intfindMaxValue(char*str,intdiv){intn=strlen(str);// 长度不符合要求if(n<=0||n>10000){return-1;}// 被除数不符合要求if(div<1||div>99){return-1;}intanswer=-1;inti=0;while(i<n){charc=str[i];// 不是字母也不是数字if(!isdigit(c)&&!isalpha(c)){return-1;}// 非数字直接跳过if(!isdigit(c)){i++;continue;}// 提取连续数字字符intj=i;intvalue=0;while(j<n&&isdigit(str[j])){chard=str[j];// 忽略前导零if(value==0&&d=='0'){j++;continue;}value=value*10+(d-'0');// 出现大于999的值if(value>999){return-1;}j++;}// 此时为提取出来的合法数字if(value%div==0){if(value>answer){answer=value;}}i=j;}returnanswer;}intmain(){charstr[1000500];intdiv;// 读取整行字符串if(!fgets(str,sizeof(str),stdin)){return0;}// 去掉换行符intlen=strlen(str);if(len>0&&str[len-1]=='\n'){str[len-1]='\0';}scanf("%d",&div);printf("%d",findMaxValue(str,div));return0;}
http://www.jsqmd.com/news/813802/

相关文章:

  • 终极CAJ转PDF解决方案:caj2pdf-qt跨平台转换完全指南
  • 无线TDoA定位中的硬件偏差问题与DTB校准方法
  • 从零构建现代化项目脚手架:核心架构设计与工程实践
  • 城通网盘直连解析工具:三步告别限速,畅享高速下载
  • 系统化调试方法论:从STOP到DETECT,告别救火式排查
  • 智能手机市场格局深度剖析:从数据看本质与行业演进规律
  • 激光带宽对半导体光刻OPC模型精度的影响与优化
  • 高铁、地铁、城际铁路爆发式增长,2026上海紧固件展聚焦高端轨交紧固件
  • py每日spider案例之某website之登录接口参数逆向(rsa 难度一般)
  • Claude Code成本追踪与工作流管理工具Ledger详解
  • 30岁测试工程师的危机:要么转管理,要么被淘汰
  • 别再为OSGB头疼了!手把手教你用osg2cesiumApp搞定Cesium三维模型加载
  • 如何用DownKyi实现B站视频自由:5个实用场景与解决方案
  • AiClaw:Go+Vue3构建的AI Agent编排平台,子Agent与六层记忆架构解析
  • 某工业除尘设备厂如何靠SEM竞价提高营业额?
  • VS Code本地代码评审扩展:结构化JSON存储与AI协同实践
  • 为什么迅雷下载比浏览器稳?从原理到实战的完整使用手册
  • 开源任务恢复工具openclaw-task-recovery:轻量级断点续做解决方案
  • 初创团队如何利用Taotoken Token Plan有效控制AI实验成本
  • VR下肢触觉交互力反馈机器人平台设计与实现
  • 2026年口碑好的浇筑母线定制厂家推荐 - mypinpai
  • 初创团队如何利用Taotoken的Token Plan有效控制AI实验成本
  • 新人如何快速融入技术团队?这5个细节决定你的第一印象
  • 深入解析Curb:基于令牌桶算法的分布式限流中间件实践
  • Google Authenticator停更引发恐慌?自建TOTP动态口令系统其实没那么难,附技术实现方案
  • 弹性腿式机器人运动控制与节能优化技术解析
  • LED显示的“芯片革命”:行列合一,正在改写画质的底层逻辑
  • PipeANN:基于SSD的十亿级向量检索系统设计与实战
  • 江苏母线槽哪家好用,性价比高 - mypinpai
  • 淘宝淘金币自动化脚本终极指南:每天节省25分钟的高效解决方案