华为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// 返回结果值
注:
- 给定的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;
- 从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 2929和3 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 00和123 123123。 - 如果输入都合法且能找到能被整除的最大数,则输出该最大数; 其他情况输出− 1 -1−1,例如: (1) 输入数据包含非法字符、值超出范围、长度超出范围等; (2) 没有找到能被i n p u t D i v i s o r inputDivisorinputDivisor整除的数。
补充说明:
- 程序运行内存要小于256 M B 256MB256MB;
- 程序运行耗时不能超过1 11秒。
样例1
输入
abc123EFEDG34aadD78er 2输出
78说明
34 3434和78 7878都能被2 22整除,78 7878为能被整除的最大数。
样例2
输入
wrwqr1.0we+de- 3输出
-1说明
参数1 11字符串中包含非法字符. + − . + -.+−
样例3
输入
ewr23hk064ASW12VBG 4输出
64说明
获取的整数列表为23 、 64 、 12 23、64、1223、64、12,能被4 44整除的最大数为64 6464
样例4
输入
ewr23hk064ASW12VBG 5输出
-1说明
获取的整数列表为23 、 64 、 12 23、64、1223、64、12,都不能被5整除
样例5
输入
wrq45ret0eww237ere 7输出
0说明
只有0 00能被7 77整除
样例6
输入
aaa2222bb66 2输出
-1说明
第一个参数中存在大于999 999999的整数,参数不合法。
题解
思路:模拟
- 首先判断
输入字符串的长度和被除数是否处于合法范围内,不属于合法范围直接返回-1. - 从前往后输入字符串,尝试提取其中的数值,具体逻辑如下:
- 当前遍历为大小写字母时,直接跳过。
- 当前遍历为数字字符时,尝试获取后序连续数字字符,提取出对应数值。当提取出数值超过999时,说明输入非法,直接返回-1。合法情况下,判断当前数值是否能整除
div,能整除情况下,尝试更新最大结果。 - 当前遍历非字母或数字字符时,说明输入非法,直接返回-1
- 按找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;}