华为历年秋招笔试真题
如需获取完整资料,请点击下方链接领取《2024校招笔试真题秘籍》(实时更新中)
不收费,3人组团即可一块免费领取!限量免费10000个名额
手机端点击免费领取:https://www.nowcoder.com/link/campus_xzbs2
电脑端请扫码领取:
1、整数反转求和
【题目描述】请您写一个reverseAdd函数, 该函数根据输入的两个正整数a和b, 然后分别将它们的数字按照高位在右边的方式反转后求和。
例如,reverseAdd(123, 456) == 321 + 654 == 975
输入描述:
函数原型:int reverseAdd (int a, int b);
输入:
输入的a,b参数均为有效取值范围[1, 70000]区间上的正整数。
100和200反转后的值为1和2(前导0被忽略)
输出描述:
输出:
通过函数返回值输出结果。
若输入的a或b参数超出了取值范围(小于1或者大于70000),则应输出-1;
否则应按照要求输出数字反转后的和。
注意:最终交付的函数代码中不要向控制台打印输出任何信息。
输入样例:
123,456
输出样例:
975
【解题思路】
二分答案,然后check这个答案的rank,这一步可以用two pointers O(n)解决。
复杂度O(nlogn)
对整数进行拆分之后翻转,然后求和即可。
【参考代码】
#include <bits/stdc++.h> using namespace std; int main() { string m,n; while(cin>>m>>n) { int x=0,y=0,i; if(m[0]=='0'&&n[0]=='0') break; for(i=m.size()-1;i>=0;i--) x=x*10+m[i]-'0'; for(i=n.size()-1;i>=0;i--) y=y*10+n[i]-'0'; cout<<x+y<<endl; } return 0; }
2、消除重复数字
【题目描述】给定一个正整数,给出消除重复数字以后最大的整数
输入描述:
正整数,注意考虑长整数
输出描述:
消除重复数字以后的最大整数
输入样例:
423234
输出样例:
432
【解题思路】
指针i,j 从数字字符串的首地址开始遍历,j作为查重的指针(在 [0,i] 之间的字符子串)
如果出现重复数字,即str[j] = str[i],那么根据题目要求,是消除重复数字以后的最大整数,就要做一个比较,判断是移除i位置的数字还是j位置的数字,如果str[j+1] > str[j],应该移除j位置的重复数字,否则移除i位置的重复数字以保证局部最大整数
【参考代码】
#include <iostream> #include <string> using name space std; int main() { string s; while(cin>>s) { string res; res = s[0]; for (int i = 1; i < s.size(); i++) { if (res.find(s[i]) == string :: npos) { res + = s[i]; } else { int t = res.find(s[i]); if ((t+1) < res.size()) { if (res[t] < res[t+1]) { res.erase(t, 1); // 移走并且调整 res + = s[i]; } } } } cout<< res <<endl; } return 0; }
3、仿
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专刊由牛客官方团队打造,主要讲解名企校招技术岗位的笔试题,内容中包含多个名企的笔试真题,附有题目思路及参考代码