华为OD机试真题 新系统 - 准备生日礼物(Py/Java/C/C++/Js/Go)

张开发
2026/4/12 11:02:51 15 分钟阅读

分享文章

华为OD机试真题 新系统 - 准备生日礼物(Py/Java/C/C++/Js/Go)
准备生日礼物华为OD机试真题 - 华为OD上机考试真题 4.8号 100分题型华为OD机试真题目录点击查看: 华为OD机试真题题库目录机考题库 算法考点详解题目描述小明在一个充满人文关怀的公司上班公司每个月都要为该月生日的同事送一份生日小礼物该事项由小明负责请帮助小明统计某一月份应该准备多少礼物重复录入的员工生日以最后一次录入结果为准请不要重复统计避免浪费。输入描述参数 1要发放礼物的月份取值 1 到 12。参数 2员工列表。参数 3员工生日日期列表该列表和员工列表中的数据对应存在一一对应关系长度一致。输出描述该月份要准备的礼品个数。补充说明小明公司的员工人数不超过 100人。员工姓名是字母和数字的组合姓名长度大于 0小于 16字节。日期录入格式统一采用 Year/Month/Day Year 长度为 4Month和 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月份。题解思路模拟使用哈希表或者类似数据结构记录每个人的生日月份。遍历哈希表统计生日月份为指定发送礼物月份数量。输出结果c#includeiostream #includevector #includestring #include utility #include sstream #includealgorithm #includecmath #includemap using namespace std; // 通用 切割函数 函数 将字符串str根据delimiter进行切割 vectorstring split(const string str, const string delimiter) { vectorstring result; size_t start 0; size_t end str.find(delimiter); while (end ! string::npos) { result.push_back(str.substr(start, end - start)); start end delimiter.length(); end str.find(delimiter, start); } // 添加最后一个部分 result.push_back(str.substr(start)); return result; } int main() { int month; string name; string birthday; cin month; // 读取空格 cin.ignore(); getline(cin, name); getline(cin, birthday); vectorstring names split(name, ); vectorstring birthdays split(birthday, ); mapstring, int nameMonth; for (int i 0; i names.size(); i) { string currentName names[i]; string currentBirthday birthdays[i]; nameMonth[currentName] stoi(split(currentBirthday, /)[1]); } // 统计 int count 0; for (auto p : nameMonth) { if (p.second month) { count; } } cout count; return 0; }JAVAimport java.util.*; public class Main { public static int calGiftNum(int month, String[] names, String[] birthdays) { MapString, Integer nameMonth new HashMap(); for (int i 0; i names.length; i) { String currentName names[i]; String currentBirthday birthdays[i]; // 生日格式xxxx/xx/xx取月份 int m Integer.parseInt(currentBirthday.split(/)[1]); nameMonth.put(currentName, m); } // 统计 int count 0; for (int m : nameMonth.values()) { if (m month) { count; } } return count; } public static void main(String[] args) { Scanner sc new Scanner(System.in); int month sc.nextInt(); sc.nextLine(); // 吃掉换行 String name sc.nextLine(); String birthday sc.nextLine(); String[] names name.split( ); String[] birthdays birthday.split( ); int res calGiftNum(month, names, birthdays); System.out.println(res); } }Pythonimportsys# 计算需要送礼物的人数defcalGiftNum(month,names,birthdays):nameMonth{}foriinrange(len(names)):currentNamenames[i]currentBirthdaybirthdays[i]# 生日格式xxxx/xx/xx取月份mint(currentBirthday.split(/)[1])nameMonth[currentName]m# 统计count0forminnameMonth.values():ifmmonth:count1returncountif__name____main__:monthint(sys.stdin.readline().strip())namessys.stdin.readline().strip().split()birthdayssys.stdin.readline().strip().split()rescalGiftNum(month,names,birthdays)print(res)JavaScriptconstreadlinerequire(readline);constrlreadline.createInterface({input:process.stdin,output:process.stdout});letlines[];rl.on(line,(line){lines.push(line);});rl.on(close,(){letmonthparseInt(lines[0]);letnameslines[1].trim().split( );letbirthdayslines[2].trim().split( );functioncalGiftNum(month,names,birthdays){letnameMonthnewMap();for(leti0;inames.length;i){letcurrentNamenames[i];letcurrentBirthdaybirthdays[i];letmparseInt(currentBirthday.split(/)[1]);nameMonth.set(currentName,m);}letcount0;for(letmofnameMonth.values()){if(mmonth)count;}returncount;}letrescalGiftNum(month,names,birthdays);console.log(res);});Gopackagemainimport(bufiofmtosstrconvstrings)// 计算需要送礼物的人数funccalGiftNum(monthint,names[]string,birthdays[]string)int{nameMonth:make(map[string]int)fori:0;ilen(names);i{currentName:names[i]currentBirthday:birthdays[i]// 生日格式xxxx/xx/xx取月份parts:strings.Split(currentBirthday,/)m,_:strconv.Atoi(parts[1])nameMonth[currentName]m}count:0for_,m:rangenameMonth{ifmmonth{count}}returncount}funcmain(){reader:bufio.NewReader(os.Stdin)line,_:reader.ReadString(\n)month,_:strconv.Atoi(strings.TrimSpace(line))line1,_:reader.ReadString(\n)line2,_:reader.ReadString(\n)names:strings.Fields(line1)birthdays:strings.Fields(line2)res:calGiftNum(month,names,birthdays)fmt.Println(res)}C语言#includestdio.h#includestring.h#includestdlib.h#defineMAXN1000#defineMAXLEN100// 查找名字是否已存在intfind(charnames[][MAXLEN],intsize,char*target){for(inti0;isize;i){if(strcmp(names[i],target)0){returni;}}return-1;}intcalGiftNum(intmonth,charnamesArr[][MAXLEN],charbirthdaysArr[][MAXLEN],intn){charnames[MAXN][MAXLEN];intmonths[MAXN];intsize0;for(inti0;in;i){char*currentNamenamesArr[i];// 解析月份chartemp[MAXLEN];strcpy(temp,birthdaysArr[i]);char*tokenstrtok(temp,/);// 年tokenstrtok(NULL,/);// 月intmatoi(token);intidxfind(names,size,currentName);if(idx!-1){// 已存在 覆盖months[idx]m;}else{// 新增strcpy(names[size],currentName);months[size]m;size;}}// 统计intcount0;for(inti0;isize;i){if(months[i]month){count;}}returncount;}intmain(){intmonth;scanf(%d\n,month);charnameLine[10000];charbirthdayLine[10000];fgets(nameLine,sizeof(nameLine),stdin);fgets(birthdayLine,sizeof(birthdayLine),stdin);charnames[MAXN][MAXLEN];charbirthdays[MAXN][MAXLEN];intn0;// 拆分 nameschar*tokenstrtok(nameLine, \n);while(token!NULL){strcpy(names[n],token);tokenstrtok(NULL, \n);n;}// 拆分 birthdaysintm0;tokenstrtok(birthdayLine, \n);while(token!NULL){strcpy(birthdays[m],token);tokenstrtok(NULL, \n);m;}// 调用核心函数intrescalGiftNum(month,names,birthdays,n);printf(%d\n,res);return0;}

更多文章