拼多多学霸批算法工程师笔试题经验
1. a数组中除了一个数之外严格升序, 在b数组中找一个最大的数替换a数组中违反升序的数
思路: 违反升序的数可能有两个, 如1, 3, 8, 7, 10
中替换掉8或者7都可以, 两种情况都遍历一下即可
def exchange(nums1, nums2): poses = [] for i in range(len(nums1)): if not(i == 0 or nums1[i] > nums1[i-1]) or \ not(i == len(nums1)-1 or nums1[i] < nums1[i+1]): left = None if i == 0 else nums1[i-1] right = None if i == len(nums1)-1 else nums1[i+1] poses.append((i, left, right)) res = None max_num = None for pos, left, right in poses: for n in nums2: if (left is None or n > left) and (right is None or n < right) and (max_num is None or n > max_num): res = nums1.copy() res[pos] = n max_num = n return res
2. 判断单词能否首尾相接成环
用的回溯去做的, 只过了0.95. 看别人的解法好像是判断首尾字母的出现次数即可.
import sys def is_used(used, i): return (1 & (used >> i)) != 0 def set_used(used, i): mask = 0b1 << i used = used | mask return used def cancel_used(used, i): mask = 0b1 << i mask = ~mask used = used & mask return used def backtrack(words, used, curr, length, memo): if length == len(words): memo[(curr, used)] = curr[0] == curr[-1] return memo[(curr, used)] if (curr, used) in memo: return memo[(curr, used)] res = False for i in range(len(words)): if is_used(used, i) is True: continue if len(curr) == 0 or words[i][0] == curr[-1]: used = set_used(used, i) temp_curr = curr[0] + words[i][-1] if len(curr) != 0 else words[i] res = backtrack(words, used, temp_curr, length+1, memo) used = cancel_used(used, i) if res is True: break memo[(curr, used)] = res return res line = sys.stdin.readline().strip() words = line.split(' ') used = 0 memo = {} res = backtrack(words, used, '', 0, memo) if res is True: print('true') else: print('false')
3. 任务排序, 存在依赖关系, 求平均耗时最小的执行顺序.
思路: 使用小顶堆存储当前可以执行的任务, 每次出堆后更新依赖次数, 依赖次数为0的任务加入到堆中.
#include <fstream> #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <climits> #include <map> #include <unordered_map> #include <queue> #include <deque> #include <set> #include <unordered_set> using namespace std; struct Task { int index, time; Task(): index(0), time(0) {} }; bool comp(const Task &a, const Task &b) { return a.time != b.time ? a.time > b.time : a.index > b.index; } int main() { ifstream fin("input.txt"); cin.rdbuf(fin.rdbuf()); int N, M, a, b, t; cin >> N >> M; vector<vector<bool>> G(N, vector<bool>(N, false)); vector<int> depend(N, 0); vector<Task> tasks(N); for(int i = 0; i < N; i++) { cin >> t; tasks[i].index = i+1; tasks[i].time = t; } for(int i = 0; i < M; i++) { cin >> a >> b; G[b-1][a-1] = true; depend[b-1]++; } vector<int> res; vector<Task> heap; vector<bool> visited(N, false); for(int i = 0; i < N; i++) { for(int j = 0; j < N; j++) { if(!visited[j] && depend[j] == 0) { visited[j] = true; heap.push_back(tasks[j]); push_heap(heap.begin(), heap.end(), comp); } } auto t = heap.front(); pop_heap(heap.begin(), heap.end(), comp); heap.pop_back(); res.push_back(t.index); for(int j = 0; j < N; j++) if(!visited[j] && G[j][t.index - 1]) { depend[j]--; } } cout << res[0]; for(int i = 1; i < N; i++) cout << " " << res[i]; return 0; }
4. 堆积木, 上面的积木长度必须小于下面的积木. 上面积木的总重不能超过底层积木重量的7倍.
思路: 用dp[i][h]记录以第i块积木为底, 高为h的积木塔的最低重量.
#include <fstream> #include <iostream> #include <vector> #include <algorithm> #include <utility> #include <climits> #include <map> #include <unordered_map> #include <queue> #include <deque> #include <set> #include <unordered_set> using namespace std; struct Node{ int l, w; Node(): l(0), w(0) {} }; bool comp(const Node &a, const Node &b) { return a.l != b.l ? a.l < b.l : a.w < b.w; } int main() { ifstream fin("input.txt"); cin.rdbuf(fin.rdbuf()); int N, w, l; cin >> N; vector<Node> nodes(N); for(int i = 0; i < N; i++) { cin >> l; nodes[i].l = l; } for(int i = 0; i < N; i++) { cin >> w; nodes[i].w = w; } sort(nodes.begin(), nodes.end(), comp); int res = 1; vector<vector<int>> dp(N, vector<int>(N+1, -1)); dp[0][1] = nodes[0].w; for(int i = 1; i < N; i++) { dp[i][1] = nodes[i].w; for(int h = 2; h <= N; h++) { for(int j = i-1; j >= 0; j--) { if(dp[j][h-1] != -1 && nodes[i].w * 7 >= dp[j][h-1] && (dp[i][h] == -1 or nodes[i].w + dp[j][h-1] < dp[i][h])) { res = max(res, h); dp[i][h] = nodes[i].w + dp[j][h-1]; } } } } cout << res << endl; return 0; }#拼多多##笔试题目#