网易笔试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<>();记录对应关系。当然还有挺多其他细节的。
#牛客创作赏金赛#
查看7道真题和解析