网易笔试AK
T1 括号匹配(100%)
力扣刷过这个题目,这个题目进阶了一下,比如【{】}这种是不可以的。用replaceAll也不卡时间
T2 BFS(100%)
蓝桥杯有一个类似的,不过是把颜色变成红绿灯。
直接bfs,然后vis数组开两个,一个蓝色一个红色,注意这个数组不能记录边(这样过75%),要记录当前在这个节点,是蓝色或红色这个状态之前有没有出现过。
while(!q.empty()){ int siz = q.size(); for(int i = 0; i < siz; i++){ pair<int, int> cp = q.front(); q.pop_front(); int ind = cp.first, se = cp.second; if(se == 0) { visb[ind] = 1; }else{ visr[ind] = 1; } if(ind == t) { cout << res << endl; tag = true; break; } for(int j = 0; j < g[ind].size(); j++){ pair<int, int> root = g[ind][j]; // 能走 if(se == root.second) { int nse = (root.second == 0 ? 1 : 0); if(nse == 0){ if(visb[root.first] == 1) continue; }else{ if(visr[root.first] == 1) continue; } // 颜色切换 q.push_back({root.first, (root.second == 0 ? 1 : 0)}); } } } res++; if(tag) break; } if(!tag) cout << -1 << endl; return 0;
T3 dp(100%)
这个相对来说比较简单了,dp【i】记录快递员到达i时的最大利润,然后那个map记录尾节点
// 到达节点x时,手里的钱最大值 long[] dp = new long[n+1]; for(int i = 1; i <= n; i++){ // 更新dp[i] dp[i] = dp[i-1]; if(mp.containsKey(i)){ // 尝试当前节点每一个快递都送的情况 for(int j = 0; j < mp.get(i).size(); j++){ List<Integer> ls = mp.get(i).get(j); int l = ls.get(0), z = ls.get(1); dp[i] = Math.max(dp[i], dp[l] + z + i - l); } } }
T4 字符串问题(100%)
被这个题目坑了一下,以为是一个并查集,把所有关联用连一起。后面写完才发现可以有英文重复,例如例子中的
avoided。所有这个题目直接用个Map<Integer, List<Integer>> mp1 = new HashMap<>();记录对应关系。当然还有挺多其他细节的。
#牛客创作赏金赛#