拼多多提前批算法笔试(ac,ac,ac,40%)

第一题比较简单,找出a[idx] > a[idx+1]的位置,先判断能不能改idx+1,再判断能不能改idx(改idx+1更大),都不能就输出NO。
第二题哈希表存储每个字母在字符串头尾的数量,最后遍历26个字母,有奇数的就false
第三题想明白就比较简单,主要思想是可以完成的任务中优先完成时间短的(保证平均等待短),这部分用优先队列就可以(堆)。然后依赖关系用计个数就可以了,新的加到队列中
第四题暴力方法就是直接递归,拿不拿每个积木,这样只能40%。结束后感觉应该可以dp求解,类似一个变种的二约束背包问题。
楼下放代码
#拼多多##笔试题目##提前批##算法工程师#
全部评论
第三题 typedef struct node {     int x, y;     friend bool operator <(node a, node b) {         if (a.x == b.x)             return a.y > b.y;         else             return a.x > b.x;     }     node(int a, int b) {         x = a;         y = b;     } }; int main() {     priority_queue<node> q;     int n, m;     cin >> n >> m;     vector<int> need_time(n + 1);     for (int i = 1; i <= n; i++)         cin >> need_time[i];     vector<vector<int>> depen(n + 1);     vector<int> de_nums(n + 1, 0);     for (int i = 0; i < m; i++) {         int a, b;         cin >> a >> b;         de_nums[b]++;         depen[a].push_back(b);     }     for (int i = 1; i <= n; i++)         if (de_nums[i] == 0)             q.push(node(need_time[i], i));     vector<int> res;     while (!q.empty()) {         int y = q.top().y;         res.push_back(y);         q.pop();         for (int i = 0; i < depen[y].size(); i++) {             de_nums[depen[y][i]]--;             if (de_nums[depen[y][i]] == 0)                 q.push(node(need_time[depen[y][i]], depen[y][i]));         }     }     for (int i = 0; i < res.size(); i++)         cout << res[i] << ' ';     cout << endl;     system("pause");         return 0; }
点赞 回复 分享
发布于 2019-07-28 17:11
老哥你确定第二题能ac?若是字符串自成俩环呢?比如 ab ba cd dc 也都是偶数?更不用说还有 aa bb cc dd 了?深度递归好伐?
点赞 回复 分享
发布于 2019-07-28 17:13
第一题: int main() {     vector<int> A, B;     char temp[10000];     cin.getline(temp, 10000);     int l = 0;     int sum = 0;     while (temp[l] != '\0') {         if (temp[l] == ' ') {             A.push_back(sum);             sum = 0;         }         else             sum = sum * 10 + temp[l] - '0';         l++;     }     A.push_back(sum);     cin.getline(temp, 10000);     l = 0;     sum = 0;     while (temp[l] != '\0') {         if (temp[l] == ' ') {             B.push_back(sum);             sum = 0;         }         else             sum = sum * 10 + temp[l] - '0';         l++;     }     B.push_back(sum);     sort(B.begin(), B.end());     int idx;     for (idx = 0; idx < (int)A.size() - 1; idx++)         if (A[idx] >= A[idx + 1])             break;     for (int i = (int)B.size() - 1; i >= 0; i--) {         if ((B[i] > A[idx]) && (idx == (int)A.size() - 2 || B[i] < A[idx + 2])) {             A[idx + 1] = B[i];             for (int j = 0; j < A.size(); j++)                 cout << A[j] << ' ';             cout << endl;             system("pause");             return 0;             break;         }     }          for (int i = (int)B.size() - 1; i >= 0; i--) {         if ((B[i] < A[idx + 1]) && (idx == 0 || B[i] > A[idx - 1])) {             A[idx] = B[i];             for (int j = 0; j < A.size(); j++)                 cout << A[j] << ' ';             cout << endl;             system("pause");             return 0;             break;         }     }          cout << "NO" << endl;     system("pause");     return 0; }
点赞 回复 分享
发布于 2019-07-28 17:10
大佬
点赞 回复 分享
发布于 2019-07-28 17:10
第二题 int main() {     vector<int> m(26, 0);     char s[1000000];     cin.getline(s, 1000000);     int l = 0;     string temp = "";     while (s[l] != '\0') {         if (s[l] == ' ') {             m[temp[0] - 'A']++;             m[temp[temp.size() - 1] - 'A']++;             temp = "";         }         else             temp += s[l];         l++;     }     m[temp[0] - 'A']++;     m[temp[temp.size() - 1] - 'A']++;     for (int i = 0; i < 26; i++) {             if (m[i] % 2 != 0) {             cout << "false" << endl;             system("pause");             return 0;         }     }     cout << "true" << endl;     system("pause");     return 0; }
点赞 回复 分享
发布于 2019-07-28 17:11
第四题 暴力递归(40%) bool cmp(pair<int, int> &a, pair<int, int> &b) {     if (a.first == b.first)         return a.second > b.second;     else         return a.first > b.first; } void helper(vector<pair<int, int>> x, int max_weight, int height, int &res, int idx, int max_l) {     res = max(res, height);     if (idx == x.size())         return;     if (x[idx].first < max_l && x[idx].second <= max_weight) {         if (max_weight - x[idx].second < x[idx].second * 7)             helper(x, max_weight - x[idx].second, height + 1, res, idx + 1, x[idx].first);         else             helper(x, x[idx].second * 7, height + 1, res, idx + 1, x[idx].first);     }     helper(x, max_weight, height, res, idx + 1, max_l); } int main() {     int n;     cin >> n;     vector<int> L(n), W(n);     for (int i = 0; i < n; i++)         cin >> L[i];     for (int i = 0; i < n; i++)         cin >> W[i];     vector<pair<int, int>> x;     for (int i = 0; i < n; i++)         x.push_back(make_pair(L[i], W[i]));     sort(x.begin(), x.end(), cmp);     int res = 0;     helper(x, INT_MAX, 0, res, 0, INT_MAX);     cout << res << endl;     system("pause");     return 0; }
点赞 回复 分享
发布于 2019-07-28 17:11
第二题python A = [str(n) for n in input().split()] start = [] end = [] for i in range(len(A)): start.append(A[i][0]) end.append(A[i][-1]) start.sort() end.sort() print(start == end)
点赞 回复 分享
发布于 2019-07-28 17:16
“qaq”,“ewe”,这两个字符串是不能形成环的
点赞 回复 分享
发布于 2019-07-28 17:36
第二题欧拉回路,要加一个连通图判断
点赞 回复 分享
发布于 2019-07-28 18:03
大佬666
点赞 回复 分享
发布于 2019-07-28 17:11
你还是牛逼,能对三个以上的都是大佬
点赞 回复 分享
发布于 2019-07-28 17:12
强啊
点赞 回复 分享
发布于 2019-07-28 17:12
大佬
点赞 回复 分享
发布于 2019-07-28 17:13
膜拜一下大佬
点赞 回复 分享
发布于 2019-07-28 17:14
第四题我也想的dp,但是不知道怎么做
点赞 回复 分享
发布于 2019-07-28 17:17
第二题思路没懂啊,怎么排出两个闭合圈的情况呢? 比如说我的输入是AB BA CD DC。
点赞 回复 分享
发布于 2019-07-28 17:18
第二题思路错误,应该用剪枝dfs
点赞 回复 分享
发布于 2019-07-28 17:26
大佬,牛逼
点赞 回复 分享
发布于 2019-07-28 17:28
第二题方法有问题,只是测试数据太弱了……mxm axa
点赞 回复 分享
发布于 2019-07-28 17:28
有大佬给第一题ac的java代码吗
点赞 回复 分享
发布于 2019-07-28 17:30

相关推荐

2024-11-30 22:57
门头沟学院 golang
牛客533433175号:更可气的是我做完这些给我拒了
点赞 评论 收藏
分享
牛客389580366号:读书的意义在于提升自己和他人吧,“阶级意识”是读书过程中的产出,“跨越阶级”是通过读书获得的能力
点赞 评论 收藏
分享
评论
点赞
136
分享
牛客网
牛客企业服务