4.9 荣耀笔试凉凉
学的c++,笔试3题100 200 300;只有第一题通过83%
第一题抽幸运观众 ,超简单 但不知道哪个测试用例一直通过不了,心态爆炸,代码后面列出帮我看看哪里有问题。
第二题输入要接受一长条字符串作处理,c++字符串分隔split没了解到有啥好用的,要分隔substr处理用着难受,逻辑也不好写直接放弃。输入接收好处理不难,用java写的话这题应该很好做。字符串大概是
“a.iso:fd1 no,fd2 yes,fd5 no;b.iso:fd1 yes,fd3 no,fd4,yes,fd6 no”这种类型。有了解c++怎么处理字符串的教教我。
第三题贼难,输入很好处理。但一个测试用例有T个样本要返回,所以也不能面向测试用例编了。题目是给定一个数组arr ,arr[i]表示第i号咖啡机泡一杯咖啡的时间。给定一个正数N,表示N个人等着咖啡机泡咖啡,每台咖啡机只能轮流泡咖啡只有一台清洗机,一次只能洗一个杯子,时间消耗a,洗完才能下一杯。每个咖啡杯也可以自己挥发干净,时间消耗b,咖啡杯可以并行挥发。忽略每个人喝咖啡时间。返回从开始到所有咖啡杯变干净的最短时间。
我参考左神的java代码写了c++版本。后面本地写的也列出来大家讨论讨论,有不懂的可以去哔哩哔哩看看左神DP 的38P。
用到了优先级队列小顶堆以及动态规划,一共就2个小时,没几个能写出来吧。
看到别人的简单题是爬楼梯,表示羡慕了,我的第一题也很简单,但是不能100%,感觉是题目问题,或者靠后的其实是字典序靠后?当时也没想到试试。叹气。如果真是字典序那也是题目描述不对吧,题目示例解读种也有错误xyx解读成75。
#荣耀笔试##笔试题目##笔经##C/C++#//第一题 题目说 输入6个字符串,字符串长度<=10 ,第一个是嘉宾,后面5个是观众。 //幸运值值字符串的和:如ace就是1+3+4=8;以此类推。返回与嘉宾幸运值最接近的观众。 //如果有多个观众同样最接近的话,返回最后的那名观众。 #include <iostream> #include <vector> using namespace std; int main() { string str; vector<string> vec; string jiabin; cin >> jiabin; while (cin >> str) { vec.push_back(str); } int target = 0; for (auto it : jiabin) { if (it >= 'a' && it <= 'z') { target += it - 'a' + 1; } else if (it >= 'A' && it <= 'Z') { target += it - 'A' + 1; } } vector<int> result; for (auto str : vec) { int res = 0; for (auto it : str) { if (it >= 'a' && it <= 'z') { res += it - 'a' + 1; } else if (it >= 'A' && it <= 'Z') { res += it - 'A' + 1; } } result.push_back(res); } int size = result.size(); int min = INT32_MAX; int min_index; for (int i = size - 1; i >= 0; --i) { if (abs(result[i] - target) < min) { min = abs(result[i] - target); min_index = i; } } cout << vec[min_index]; } -------------------------------------------------------------- 第三题: #include <iostream> #include <vector> #include <queue> using namespace std; class Machine { public: int timePoint; int workTime; Machine(int t, int w) : timePoint(t), workTime(w) { } }; struct cmp { public: bool operator()(Machine a, Machine b) { return a.timePoint + a.workTime > b.timePoint + b.workTime; } }; class solution { public: //优先级队列实现模拟排队效果,排序规则为开始时间+泡咖啡时间 小的优先 //drinks是N个人泡完咖啡的最优时间 static int minTime1(vector<int>& arr, int n, int a, int b) { priority_queue<Machine, vector<Machine>, cmp> heap;//小根堆 for (int i = 0; i < arr.size(); i++) { heap.push(Machine(0, arr[i])); } vector<int> drinks(n); for (int i = 0; i < n; i++) { Machine cur = heap.top(); heap.pop(); cur.timePoint += cur.workTime; drinks[i] = cur.timePoint; heap.push(cur); } return bestTime(drinks, a, b, 0, 0); //return dp(drinks, a, b); } // a 洗一杯时间 // b 自己挥发干净的时间 固定变量 // drinks[0..index-1]都已经干净了 // drinks[index...]需要变干净 ,washLine表示洗的机器何时能用 //drinks[index...]变干净,最少的时间点返回 //方法1暴力递归 //drinks 所有杯子可以开始洗的时间, wash 单杯洗干净时间(串行) //air 挥发干净时间(并行) free洗的机器什么时间可以用 //返回 drinks[index...]都变干净的最早结束时间 static int bestTime(vector<int>& drinks, int wash, int air, int index, int free) { if (index == drinks.size()) {//没有杯子要洗 return 0; } //index号杯子 决定洗 取清洗机空余开始时间和index可以开始洗的最大值 +wash单杯时间 int selfClean1 = max(drinks[index], free) + wash; int restClean1 = bestTime(drinks, wash, air, index + 1, selfClean1);//下次可以洗完时间是index洗完 //所有杯子都要洗完,所以返回 index杯洗完 以及 剩下杯子洗完 的最大值 int p1 = max(selfClean1, restClean1); //index 号决定挥发 没有用清洗机 int selfClean2 = drinks[index] + air; int restClean2 = bestTime(drinks, wash, air, index + 1, free); int p2 = max(selfClean2, restClean2);//同上面原因 return min(p1, p2);//返回2者的最小值 } //方法2动态规划,由1优化 static int minTime2(vector<int>& arr, int n, int a, int b) { priority_queue<Machine, vector<Machine>, cmp> heap;//小根堆 for (int i = 0; i < arr.size(); i++) { heap.push(Machine(0, arr[i])); } vector<int> drinks(n); for (int i = 0; i < n; i++) { Machine cur = heap.top(); heap.pop(); cur.timePoint += cur.workTime; drinks[i] = cur.timePoint; heap.push(cur); } return bestTimeDp(drinks, a, b); } static int bestTimeDp(vector<int>& drinks, int wash, int air) { int N = drinks.size(); int maxFree = 0;// 估计dp数组size for (int i = 0; i < drinks.size(); i++) { maxFree = max(maxFree, drinks[i]) + wash;//maxFree 上一杯洗完的时间 } vector<vector<int>> dp(N + 1, vector<int>(maxFree + 1, 0)); //dp[n][...]都为0 for (int index = N - 1; index >= 0; index--) { for (int free = 0; free <= maxFree; free++) { int selfClean1 = max(drinks[index], free) + wash; //int selfClean1 = max(drinks[index], free) + wash; //!!!int restClean1 = dp[index + 1][selfClean1];selfClean1>maxfree时越界 if (selfClean1 > maxFree) continue; int restClean1 = dp[index + 1][selfClean1]; //int restClean1 = bestTime(drinks, wash, air, index + 1, selfClean1);//下次可以洗完时间是index洗完 ////所有杯子都要洗完,所以返回 index杯洗完 以及 剩下杯子洗完 的最大值 int p1 = max(selfClean1, restClean1); //int p1 = max(selfClean1, restClean1); ////index 号决定挥发 没有用清洗机 int selfClean2 = drinks[index] + air; //int selfClean2 = drinks[index] + air; int restClean2 = dp[index + 1][free]; //int restClean2 = bestTime(drinks, wash, air, index + 1, free); int p2 = max(selfClean2, restClean2); //int p2 = max(selfClean2, restClean2);//同上面原因 dp[index][free] = min(p1, p2); //return min(p1, p2);//返回2者的最小值 } } return dp[0][0]; } }; int main() { vector<int> arr = { 2,3 }; cout << solution::minTime1(arr, 5, 2, 2) << endl; cout << solution::minTime1(arr, 5, 2, 2) << endl; vector<int> arr2 = { 2,4,5 }; cout << "--------------------" << endl; cout << solution::minTime1(arr2, 8, 1, 3) << endl; cout << solution::minTime1(arr2, 8, 1, 3) << endl; system("pause"); return 0; }