华为OD机试真题 新系统 - 准备生日礼物 (Java/Py/C/C++/Js/Go)
准备生日礼物
2026 华为OD机试真题 4月8日华为OD上机新系统考试真题 100 分题型
点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解
题目描述
小明在一个充满人文关怀的公司上班,公司每个月都要为该月生日的同事送一份生日小礼物,该事项由小明负责,请帮助小明统计某一月份应该准备多少礼物,重复录入的员工生日以最后一次录入结果为准,请不要重复统计,避免浪费。
输入描述
参数 1,要发放礼物的月份,取值 1 到 12。
参数 2,员工列表。
参数 3,员工生日日期列表,该列表和员工列表中的数据对应存在一一对应关系,长度一致。
补充说明
- 小明公司的员工人数不超过 100人。
- 员工姓名是字母和数字的组合,姓名长度大于 0,小于 16字节。
- 日期录入格式统一采用 Year/Month/Day ,Year 长度为 4,Month和 Day 长度为 11 到 22,系统保证录入日期为合法日期。
- 不考虑同名多位员工的情况,名字一致即可认为是同一员工(在生产系统会通过工号区分,本系统简化处理)。
输出描述
该月份要准备的礼品个数。
示例1
输入
5 Alice Bob Charlie David Eve Frank Grace Helen 1985/5/10 1990/10/11 1995/10/11 2000/11/10 2005/05/01 2010/10/13 2015/10/14 2020/5/2输出
3说明
在 5 月份出生的员工有 3 人 ,因此返回为 3 。
示例2
输入
10 Alice Bob Charlie David Eve Frank Grace Helen 1985/05/10 1990/10/11 1995/10/11 2000/11/10 2005/10/13 2010/10/13 2015/10/14 2020/10/15输出
6说明
10 月份出生的员工有 6 人,因此返回 6 。
示例3
输入
5 Alice Bob Charlie Alice Eve Frank Grace Helen 1985/5/10 1990/10/11 1995/10/11 1985/7/10 2005/05/01 2010/10/13 2015/10/14 2020/5/2输出
2说明
5 月份出生的员工有 2 个,因此返回 2。
说明:Alice重复录入了,第一次录入出生月份为 5 月,第二次录入出生月份为 7 月,因此 Alice不被统计到 5月份。
解题思路
核心思想
本题是一道简单的字符串解析与哈希表(或者字典)应用题。主要逻辑如下:
- 输入解析:依次读取目标月份、员工姓名列表、员工生日列表。
- 去重与更新:题目要求“重复录入的员工生日以最后一次录入结果为准”。我们可以利用哈希表(字典)存储员工的姓名和对应的生日。顺序遍历姓名和生日列表,将姓名作为键,生日作为值存入字典。由于是按顺序处理,后出现的同名员工会自动覆盖前面的记录,从而天然满足题意。
- 统计结果:遍历字典中的所有生日,将其按
/分割,提取出月份部分。如果该月份等于目标月份,则将计数器加一。 - 输出结果:最后输出计数器的值。
复杂度分析
- 时间复杂度:O ( N ) O(N)O(N),其中N NN是员工的人数。我们需要遍历员工列表将其存入哈希表,然后再遍历哈希表进行月份匹配,两次遍历的时间复杂度均为O ( N ) O(N)O(N)。
- 空间复杂度:O ( N ) O(N)O(N),使用哈希表存储每个员工的姓名和生日,最坏情况下没有重复员工,哈希表大小为N NN。
Java
importjava.util.HashMap;importjava.util.Map;importjava.util.Scanner;publicclassMain{publicstaticvoidmain(String[]args){Scannerscanner=newScanner(System.in);// 读取目标月份if(!scanner.hasNextInt())return;inttargetMonth=scanner.nextInt();scanner.nextLine();// 消耗换行符// 读取员工列表和生日列表String[]names=scanner.nextLine().split(" ");String[]birthdays=scanner.nextLine().split(" ");// 使用 HashMap 存储员工姓名和生日,自动处理重复覆盖Map<String,String>employeeMap=newHashMap<>();for(inti=0;i<names.length;i++){employeeMap.put(names[i],birthdays[i]);}intcount=0;// 遍历所有去重后的员工生日for(Stringbirthday:employeeMap.values()){String[]parts=birthday.split("/");if(parts.length>=2){// 提取月份并转换为整数比较intmonth=Integer.parseInt(parts[1]);if(month==targetMonth){count++;}}}// 输出结果System.out.println(count);scanner.close();}}Python
importsysdefmain():# 读取所有输入行并去除两端空白input_data=sys.stdin.read().splitlines()iflen(input_data)<3:return# 目标月份target_month=int(input_data[0].strip())# 员工姓名列表names=input_data[1].strip().split()# 员工生日列表birthdays=input_data[2].strip().split()# 字典自动去重,后出现的覆盖前面的employee_dict={}foriinrange(len(names)):employee_dict[names[i]]=birthdays[i]count=0# 遍历字典的值统计匹配的月份forbinemployee_dict.values():parts=b.split('/')iflen(parts)>=2:month=int(parts[1])ifmonth==target_month:count+=1# 输出结果print(count)if__name__=="__main__":main()JavaScript
constreadline=require('readline');constrl=readline.createInterface({input:process.stdin,output:process.stdout});letlines=[];rl.on('line',(line)=>{lines.push(line.trim());});rl.on('close',()=>{if(lines.length<3)return;// 目标月份lettargetMonth=parseInt(lines[0]);// 员工姓名列表letnames=lines[1].split(' ');// 员工生日列表letbirthdays=lines[2].split(' ');// 使用 Map 进行去重和覆盖letemployeeMap=newMap();for(leti=0;i<names.length;i++){if(names[i].length>0){employeeMap.set(names[i],birthdays[i]);}}letcount=0;// 遍历统计目标月份for(letbirthdayofemployeeMap.values()){letparts=birthday.split('/');if(parts.length>=2){letmonth=parseInt(parts[1]);if(month===targetMonth){count++;}}}// 输出结果console.log(count);});C++
#include<iostream>#include<vector>#include<string>#include<unordered_map>#include<sstream>usingnamespacestd;intmain(){inttargetMonth;if(!(cin>>targetMonth))return0;string dummy;getline(cin,dummy);// 消耗换行符string namesLine,birthdaysLine;getline(cin,namesLine);getline(cin,birthdaysLine);vector<string>names;vector<string>birthdays;string temp;// 解析姓名列表stringstreamssNames(namesLine);while(ssNames>>temp){names.push_back(temp);}// 解析生日列表stringstreamssBirthdays(birthdaysLine);while(ssBirthdays>>temp){birthdays.push_back(temp);}// 哈希表去重并记录最后一次生日unordered_map<string,string>employeeMap;for(size_t i=0;i<names.size();i++){employeeMap[names[i]]=birthdays[i];}intcount=0;for(constauto&pair:employeeMap){string birthday=pair.second;// 查找第一个和第二个 '/' 的位置size_t firstSlash=birthday.find('/');size_t secondSlash=birthday.find('/',firstSlash+1);if(firstSlash!=string::npos&&secondSlash!=string::npos){// 提取月份字符串并转换为整数string monthStr=birthday.substr(firstSlash+1,secondSlash-firstSlash-1);intmonth=stoi(monthStr);if(month==targetMonth){count++;}}}// 输出结果cout<<count<<endl;return0;}Go
packagemainimport("bufio""fmt""os""strconv""strings")funcmain(){scanner:=bufio.NewScanner(os.Stdin)// 读取目标月份if!scanner.Scan(){return}targetMonthStr:=strings.TrimSpace(scanner.Text())targetMonth,_:=strconv.Atoi(targetMonthStr)// 读取姓名列表if!scanner.Scan(){return}names:=strings.Fields(scanner.Text())// 读取生日列表if!scanner.Scan(){return}birthdays:=strings.Fields(scanner.Text())// map去重employeeMap:=make(map[string]string)fori:=0;i<len(names);i++{employeeMap[names[i]]=birthdays[i]}count:=0// 遍历统计for_,birthday:=rangeemployeeMap{parts:=strings.Split(birthday,"/")iflen(parts)>=2{month,_:=strconv.Atoi(parts[1])ifmonth==targetMonth{count++}}}// 输出结果fmt.Println(count)}C语言
#include<stdio.h>#include<stdlib.h>#include<string.h>#defineMAX_EMPLOYEES105#defineMAX_NAME_LEN20#defineMAX_DATE_LEN25// 员工结构体typedefstruct{charname[MAX_NAME_LEN];charbirthday[MAX_DATE_LEN];}Employee;intmain(){inttargetMonth;if(scanf("%d",&targetMonth)!=1)return0;// 读取直到行尾intc;while((c=getchar())!='\n'&&c!=EOF);charnamesLine[MAX_EMPLOYEES*MAX_NAME_LEN];charbirthdaysLine[MAX_EMPLOYEES*MAX_DATE_LEN];if(fgets(namesLine,sizeof(namesLine),stdin)==NULL)return0;if(fgets(birthdaysLine,sizeof(birthdaysLine),stdin)==NULL)return0;charnames[MAX_EMPLOYEES][MAX_NAME_LEN];charbirthdays[MAX_EMPLOYEES][MAX_DATE_LEN];intnameCount=0;intbdayCount=0;// 解析姓名char*token=strtok(namesLine," \n\r");while(token!=NULL){strcpy(names[nameCount++],token);token=strtok(NULL," \n\r");}// 解析生日token=strtok(birthdaysLine," \n\r");while(token!=NULL){strcpy(birthdays[bdayCount++],token);token=strtok(NULL," \n\r");}Employee uniqueEmployees[MAX_EMPLOYEES];intuniqueCount=0;// 遍历所有输入,进行去重和覆盖for(inti=0;i<nameCount;i++){intfound=0;for(intj=0;j<uniqueCount;j++){if(strcmp(uniqueEmployees[j].name,names[i])==0){// 覆盖已有的生日strcpy(uniqueEmployees[j].birthday,birthdays[i]);found=1;break;}}if(!found){// 新增员工strcpy(uniqueEmployees[uniqueCount].name,names[i]);strcpy(uniqueEmployees[uniqueCount].birthday,birthdays[i]);uniqueCount++;}}intcount=0;// 统计匹配月份for(inti=0;i<uniqueCount;i++){intyear,month,day;// 解析 Year/Month/Dayif(sscanf(uniqueEmployees[i].birthday,"%d/%d/%d",&year,&month,&day)==3){if(month==targetMonth){count++;}}}// 输出结果printf("%d\n",count);return0;}完整用例
用例1
5 Alice Bob Charlie David Eve Frank Grace Helen 1985/5/10 1990/10/11 1995/10/11 2000/11/10 2005/05/01 2010/10/13 2015/10/14 2020/5/2用例2
10 Alice Bob Charlie David Eve Frank Grace Helen 1985/05/10 1990/10/11 1995/10/11 2000/11/10 2005/10/13 2010/10/13 2015/10/14 2020/10/15用例3
5 Alice Bob Charlie Alice Eve Frank Grace Helen 1985/5/10 1990/10/11 1995/10/11 1985/7/10 2005/05/01 2010/10/13 2015/10/14 2020/5/2用例4
10 piMyZAF2r4VUiN2 TW4FQtvCA1 bs2u4Fhyo Q6H91zlHqUdJbhH ia tHESa7Hoc6lCUV nksbA 6TUcd46NiDX 5jz OP99YCa troJn BiWVSZqxCBGw9 oO4wXGVOTm tmAM bt MMGJIhWHiFH Z9MSdKIhymUp nLpIfTD3YOQK 63Krtu nqVIih DlfXbtFDP UltRjt2ajF FqO 1980/06/02 1953/07/23 1996/11/21 1966/01/13 2010/07/20 2001/04/01 1954/11/05 1998/10/08 1962/06/25 1950/02/08 1981/09/10 1986/10/14 2015/03/04 1961/11/22 1992/05/27 1989/10/20 2019/11/26 2021/10/07 1959/10/01 1984/10/09 1996/09/06 1971/06/26 1969/10/04用例5
6 MaKRwEyKnKrWglB sN1 imUUF86uWpfOQTR Vgj7MrKlsT4 7TODu0MySW 5OSj5dWaX jpCkNeJ ACLumZ26 yCpfCh1Rr cy5 YiY3xfWQ1t OPZJM4b6Uh8MB39 J6IH5wrHnJWMDk HyIQBUXO 3oW W0 f9v9pZ tyx6 kl620bmCjj9P VgEdb JoBE cyc Nmvy Ze1A rIqIOj3AR b5Piy1 Oczc5jw8qt9 TFLMNulCfT0BYYC GNf dFslUZZwD hozBa zMQef3uG zYVIRgYIPtLem bsIgqAzJxf 28ziOaekKOliI 1983/06/19 2013/06/14 1954/06/14 2020/01/05 1985/08/14 1958/08/20 1970/06/11 1961/08/27 2004/09/24 2005/06/22 1962/01/24 1967/06/10 2009/05/24 1999/12/04 1976/12/22 2025/06/26 2024/02/26 1971/06/28 2017/02/02 2025/06/05 1997/10/07 1978/09/13 1975/06/26 2007/06/24 1995/06/07 2014/06/23 1954/11/03 2011/09/14 1995/05/14 1953/01/02 1967/01/22 2001/06/06 2016/09/20 1998/12/10 2019/03/04用例6
4 iHZe4F2 7BQGHb4UL 1DxpzAm 7BQGHb4UL XKIJ3v2oKBNC 9WNP XKYrRLGhImrY WC Zg8eTVbJkuyC 39pvrZcI0fAZ65e snyHQznI h42M0gKWBOgmpb sl R4WA7E Wh8 x 6lDXYAENK 5ZQaaoVCygECuj k7z GrAEVq2UXjwghv 0E9QIZA rigA GORzx4m5Aaur7 tii beSef2Rt 2EyHff5Y cKOW92eEVokxpc N5X oTf wneNOuJe13 kDd 2017/12/06 1998/04/18 1964/11/20 1995/11/22 2015/02/12 1975/04/25 1968/11/25 2011/09/10 2000/12/24 2019/04/24 2018/01/23 2006/07/04 2020/03/06 1978/04/07 2025/09/01 1963/02/06 1974/03/08 1958/12/28 1960/11/04 2015/10/18 1973/09/15 1952/02/17 1995/07/06 1989/05/13 2013/04/01 1968/04/11 2010/04/27 1987/05/01 2024/01/08 2003/06/17 2011/06/14用例7
11 kPk xi gvnceH1gEa MoRun0XjhsmCy3 jPrd HL nY RgFGdbdPKC 3VbvWvEdB697bL fnk1dMHMSI yXkTWWq5ioW qKWo3EsXK44Ffj 10fW E32RN F 4sfpoyn9n3 1972/08/16 2001/11/11 1970/02/15 1975/01/07 2003/11/23 2000/06/19 1998/12/03 1975/12/04 1967/04/06 1969/03/10 1963/10/23 2000/11/24 2004/12/15 1954/12/22 1953/07/03 1962/06/18用例8
1 IYqrwSXwaVlhAT pBC1JS APCW DmSTt5bbmm8 xCNQzlOFX74 Al7s2p716u3J 3 9z 2 J ru824 2 c8tR RPu9QI5D9m 2Gco6fLDQ1khpz ZAd63epBA1AZ Al7s2p716u3J xI4fH2 0JrTn 9kvk 972RhsuMjbPz CgAf1i2DcOeevv5 URnDwxJfIForvyi BZLj uDBF4sTWP ogMctfpxj3 gkVX gm9aQY t4VpwY3H C1pS azIo9t zkOqKA7rbsY R2Ub3 26RiKjB9 KnCUO c7WoMsDt3a7q SVXwS7p LJiSzq sMvY6Jsjjqkj HRhRlkNLcxW2 U uq IOgK1SGf iJXwFPcSkI nqdBCHMSO OfPlU5XKBIcDq6M 4V7nYU YANB7aEGCCMF6D 1987/01/07 2002/10/09 1961/01/23 2003/01/26 1972/04/14 1951/09/04 1980/01/01 1983/01/21 1972/01/10 1963/01/15 2020/11/16 2000/09/02 1981/08/03 2013/07/26 1999/01/03 1989/08/11 2001/05/22 1977/04/06 2022/01/21 1974/01/15 2024/07/20 1994/01/20 2004/11/20 1976/12/17 2000/04/03 2014/11/26 1985/05/10 2004/02/11 2013/01/08 1978/07/04 1994/12/19 2011/04/02 1995/06/13 1985/01/24 2017/12/17 2003/01/13 1987/01/22 1997/01/09 1959/07/03 2018/04/10 1969/12/15 2014/01/12 2019/01/13 2022/07/14 2001/01/28 1967/08/07 2000/02/05 2012/01/24用例9
11 V36Ndxd6XIL8NFT jXFNR20 XSZFp74ynhO2YCV nwNnRbFxtxrXHx5 Y3VZPt kLasjXgX7YMvfKs 1YUhyqQ3eVL6 PC gGkvgS7wDvPL0 CUKR EH laY i3MB 6HqcsC eJQ9RooLzGt pHTGQ4A ETemV bZvvPnMnFmFNW a05iCQ QYSRNy7 xd FtVS25xihU RVT ePbzfLv ejpmWZRh7jx FFLLTGoH3 JcXrBcLxjS oC A6YL4MCbK5aBJ8 FFLLTGoH3 DaI4iXEb1tinjOY BER6y1HW XV6CS7qWD Bllzfo32CaVFYFR ZneMHGSFADVn9Cl a8Duwx0bdGL qBql Qtpzo2QU91cEDC BblUUE SaCU1VqOb bYfzYi UkFDYKvE4 nH6aQEFz HV3p20vDQ1HA w VeFuFjkR Rxfb50deYvLhYVl 1964/11/06 1951/04/17 1973/02/11 2021/10/01 1993/08/25 1971/11/11 1958/07/02 2025/11/06 1952/11/01 2024/11/19 1969/04/03 1952/01/24 1998/11/27 2020/03/09 1970/11/28 1974/09/17 1963/07/15 1973/02/11 1969/11/16 2001/11/11 1973/11/21 2003/10/23 2020/01/22 2017/07/07 1964/10/25 1980/02/14 2020/03/13 2016/11/23 1984/01/28 1990/10/17 2005/09/28 1954/08/18 2008/11/07 1999/08/11 1970/11/27 2018/11/05 1955/09/16 2018/11/09 1950/11/13 2008/08/23 2000/01/06 2004/03/17 1970/11/03 1966/03/03 1989/03/27 2008/01/21 1953/02/25用例10
11 FRDtgJ8muOfZJ7 gtpnO0bnNeyYne 1yJnx0ir8Oj B6GPuYJWZKFG7jm 3rAqRg99BGUK 3ViSbTwdE7BC0 vCpcKKhrPz9 lPLTIfGsKe89k HtW9YkTCOlXj wHVLVoyp20 LmERaNv eyCxoVPeF4fK JWC f8xl 4DPXRUYgg kTKrvWyQ78 BhmGoHjeabV0 LW4bXDeo6Ax1 sPTlBR aq6So0sRPF E6HUbKzQO0FLQh8 hivRt qXvvt5Lch r3eTdSva7xYA fvCGvNpA bb67v2n2cGhQjH F95p S1HZXpH2mXwJV v8JMz2T sb B6a2Th5e3pe 2000/11/15 2001/12/11 1971/06/08 1957/03/10 1963/10/20 1972/02/25 1981/11/19 1973/04/08 1989/07/10 1995/08/02 2017/09/02 1966/04/10 1955/11/10 1950/08/23 2000/11/08 1972/11/19 2008/05/24 2006/01/10 1992/11/08 2014/09/15 2009/05/06 1991/11/08 2017/05/20 1999/06/07 1968/11/10 1971/11/27 2018/11/14 1971/12/02 1997/12/14 1992/11/03 2011/02/19文章目录
- 准备生日礼物
- 题目描述
- 输入描述
- 补充说明
- 输出描述
- 示例1
- 示例2
- 示例3
- 解题思路
- 核心思想
- 复杂度分析
- Java
- Python
- JavaScript
- C++
- Go
- C语言
- 完整用例
- 用例1
- 用例2
- 用例3
- 用例4
- 用例5
- 用例6
- 用例7
- 用例8
- 用例9
- 用例10
