6.3号 华为校招实习笔试题

第一题:就是一个ip地址转十六进制
输入:192.168.1.1
输出:C0.A8.1.1
思路:将输入的字符串以‘.’ 分割,转换为对应的十六进制数,(注意第一位不能为0,一个小坑)。就转化就完事。。

#include<bits/stdc++.h>

using namespace std;
char mp[16] = { '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
string I26(string x) {
	int k = 0;
	for (int i = 0; i < x.size(); i++) {
		k = (x[i] - '0') + k * 10;
	}
	int first = k / 16;
	int second = k % 16;
	string res;
	if(first > 0)
		res.push_back(mp[first]);
	res.push_back(mp[second]);
	return res;
}

int main() {
	string ip;
	cin >> ip;
	string res;
	string temp;
	int start = 0, j = 0;
	while (j < ip.size()) {
		if (ip[j] == '.') {
			temp = ip.substr(start, j - start);
			temp = I26(temp);
			res += temp + ".";
			start = j + 1;
		}
		j++;
	}
	temp = ip.substr(start, j - start);
	temp = I26(temp);
	res += temp;

	for (int i = 0; i < res.size(); i++)
	{
		cout << res[i];
	}
	//system("pause");
	return 0;
}

第二题:两个表合并。
这题就是来恶心人,什么字段映射合并,就是来搞人心态,尤其是用c++的,这输入就能把你恶心死。都是以字符串形式输入,还不确定有多少列!!应该是python比较好解决。直接放弃。。。。
输入:
partA.csv:
NO, Field01, Field02, Field03
01, 02, 03, 04
0x, 0x, 0x, 0x

partB.csv:
NO, Field01, Header02, Header04
11, 12, 13, 14
1y, 1y, 1y, 1y

mergeconfig.csv :
partA, partB
Field02, Header02
//EOF(以此为输入结束)
输出:
partAB.csv:
NO, Field01, Field02, Field03, Header04
01, 02, 03, 04,
0x, 0x, 0x, 0x,
11, 12, 13, , 14
1y, 1y, 1y, , 1y

第三题:两个小朋友猜一个目标数,从1开始, 可以+1 或者 +2,直到猜到为之。
输入:20  (大于10的整数,注意要判断输入是否合法,要不就90%)
输出:[10946,5473](输出一定要这种形式,不知道为啥非得整成这样。。)(输出为一个数组,第一个数表示一共有多少种不同的猜法,第二个表示先猜的小朋友获胜的种数,如果输入不合法就“返回”(应该是输出,题目给的误导人)一个空数组)
思路:这题是 一道博弈 问题,就动态规划解决(我开始用的递归,只能36.36%),二维数组或者用2个一维数组也一样。转移方程:每一个小朋友的猜中i 只能是 另一个小朋友猜中i-1或者i-2  。。
#include<bits/stdc++.h>
using namespace std;

int main() {
	int target;
	cin >> target;
    if(target <= 10){
        cout<<"[]";
        return 0;
    }
	unsigned long long count = 0;
	unsigned long long  num = 0;
	vector<vector<unsigned long long>> dp(target +1, vector<unsigned long long>(2, 0));
	dp[1][0] = 1;
	dp[1][1] = 0;
	dp[2][0] = 1;
	dp[2][1] = 1;
	for (int i = 3; i <= target; i++) {
		dp[i][0] = dp[i - 1][1] + dp[i - 2][1];//第一个小朋友猜中
		dp[i][1] = dp[i - 1][0] + dp[i - 2][0];//第二个小朋友猜中
	}


	count = dp[target][0] + dp[target][1]; //总数即为二者之和
	num = dp[target][0];
	cout << "[" << count << "," << num << "]";
	//system("pause");
	return 0;
}




#华为校招实习笔试##华为##笔经##笔试题目##C++工程师#
全部评论
第三题神马?可以描述的具体一点吗?看不懂输出为啥那样
点赞 回复 分享
发布于 2020-06-03 21:32
楼主你好,请问你是什么岗位?开发的话,是Java方向还是C++方向?或者其他语言方向~
点赞 回复 分享
发布于 2020-06-03 21:50
楼主什么时候参加的笔试?
点赞 回复 分享
发布于 2020-06-04 09:46
第二题的思路(不确定是否是优解) 1. 先用ArrayList<ArrayList<String>>存储每个文件字符串。 2. partA.csv与partB.csv比较,相同字符串part添加到新字符串,添加"A""B"到新串,添加 .csv。 3. 字段映射:合并A,B字段。进行字段替换,之后去重。 4. 不确定数据怎么处理,直接添加。
点赞 回复 分享
发布于 2020-06-09 16:26

相关推荐

美团 后端开发 总包n(15%是股票)
点赞 评论 收藏
分享
10-09 19:35
门头沟学院 Java
洛必不可达:java的竞争激烈程度是其他任何岗位的10到20倍
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
4
24
分享
牛客网
牛客企业服务