微软8.19第三次笔试, 附题目及题解
菜狗第一次做微软笔试,本来AK了美滋滋,交了之后发现自己第二题边界忘记判掉好难过。还剩一次机会,加油。考试结束之后整理下题解。
牛客编辑器排版太差了,凑合着看吧orz
// 第一题主要思路,的对x坐标贪心 O(nlog(n))
// 应该也可以直接修改原数组,但怕出问题copy
int solution(vector<int> &X, vector<int> &Y, int W) {
vector<int> puddles = X;
sort(puddles.begin(), puddles.end());
int ans = 0, border = -1; // border为最后一次drive的右边界
for(auto x : puddles){
if(border < x){
ans ++;
border = x + W;
}
}
return ans;
}
//o(n)
#include<cstring>
#include<algorithm>
#include<iostream>
#include<vector>
string solution(string &S) {
vector<int> cnts(10, 0);
string lstr, ans;
//开个size = 10的数组记录下每位数出现的次数
for(auto c : S)
cnts[c - '0'] ++;
//首先构建回文串的左边lstr,构建有两个原则:
// 1.枚举所有数字,将数字出现的次数除二加到左子串
// 2.为了结果最大,从9到0枚举(0开头非法,要判掉,忘记了,😭)
for(int i = 9; i >= 1; i --){
int t = cnts[i] >> 1;
lstr += string(t, char('0' + i));
}
if(lstr.size() > 0) lstr += string(cnts[0], '0');
ans += lstr;
//如果有数字出现次数为奇数,找到一个最大的放到中间
for(int i = 9; i >= 0; i --){
if(cnts[i] % 2){
ans += char('0' + i);
break;
}
if(i == 0 && cnts[i] && !lstr.size())
ans += '0';
}
//左子串逆序加到后面。
reverse(lstr.begin(), lstr.end());
ans += lstr;
return ans;
} 第三题.拓扑排序,dfs也可以做. p[i]记录每个点的乘客数目,初值为1;
d[N] 记录每个点的度,当度减为1时(意味着,所有应当经过该点的乘客已经到达该点), 将所有人送到下个点,计算代价。
1.目的地的度数减1
2.费用为乘客数/5 向上取整,
为了加速,用数组模拟队列。
#include<iostream>
#include<cstring>
#include<algorithm>
const int N = 1e5 + 10, M = N * 2;
int h[N], e[M], ne[M], idx = 0; //邻接表辅助数组
int d[N], q[M], p[N]; //q为拓扑排序的队列
void add(int a, int b) //邻接表添加边
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int solution(vector<int> &A, vector<int> &B) {
int n = A.size(), fee = 0;
memset(h, -1, sizeof h);
for(int i = 1; i <= n; i ++) p[i] = 1; //init()
for(int i = 0; i < n; i ++)
add(A[i], B[i]), add(B[i], A[i]), d[A[i]] ++, d[B[i]] ++; //加边,同时统计每个点的度数;
int hh = 0, tt = -1; //队列下标
for (int i = 1; i <= n; i ++ ) //遍历所有点,将所有叶节点入队
if (d[i] == 1){
q[ ++ tt] = i;
}
while (hh <= tt)
{
int t = q[hh ++ ];
if(t == 0) continue; //判掉0号点
fee += (p[t] + 4) / 5;
for (int i = h[t]; i != -1; i = ne[i])
{
int j = e[i];
p[j] += p[t];
if (-- d[j] == 1)
q[ ++ tt] = j;
}
}
return fee;
}
查看10道真题和解析

腾讯云智研发成长空间 255人发布