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比较好解决。直接放弃。。。。
输入:
第三题:两个小朋友猜一个目标数,从1开始, 可以+1 或者 +2,直到猜到为之。
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;
}