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; }