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。
 
//第一题  题目说 输入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;
}

#荣耀笔试##笔试题目##笔经##C/C++#
全部评论
什么时间段参加的
点赞 回复 分享
发布于 2022-04-12 17:22
求问楼主是9号参加的笔试11号就出结果了嘛?
点赞 回复 分享
发布于 2022-04-13 10:43
请问楼主,约面试了吗,我测评做完到现在一直没消息
点赞 回复 分享
发布于 2022-04-16 22:22

相关推荐

评论
5
18
分享
牛客网
牛客企业服务