快手笔试
2h
4算法
一
题目大意
给出一串字符串,包含有小括号,输出匹配的括号数,不匹配的左括号数,不匹配的右括号数
思路
栈
AC代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define IO ios::sync_with_stdio(0)
#define DEBUG(x) cout<<"--->"<<(x)<<endl;
typedef pair<int, int> P;
const int maxn = 2e5+5;
const ll mod = 1e9+7;
const double eps = 1e-9;
const double PI = acos(-1);
using namespace std;
stack<char> sta;
int main()
{
string s;
cin>>s;
int n = s.length();
int cnt = 0, right = 0;
for(int i=0;i<n;i++)
{
if(s[i]=='(')
sta.push('(');
else if(s[i]==')')
{
if(!sta.empty())
{
sta.pop();
cnt++;
}
else
right++;
}
}
cout<<cnt<<" "<<sta.size()<<" "<<right<<"\n";
return 0;
}
二
题目大意
给出一个数R和一个进制N,R肯定可以表示成一个N进制数,即sum(aNi),要使得这些Ni 的系数a为0或1,返回一个包含所有幂因子i的vector,若有一个Ni 的系数大于1,则返回一个空的vector
思路
进制转换
AC代码
class Solution {
public:
vector<int> GetPowerFactor(int R, int N) {
vector<int> ans;
vector<int> empty;
int cnt = 0;
while(R) {
if(R % N > 1) return empty;
if(R % N == 1)
ans.push_back(cnt);
cnt++;
R /= N;
}
sort(ans.begin(), ans.end());
return ans;
}
};
三
题目大意
有n个人在排队,每个人有两个权值a和b,若一个人排在第i个位置,则他的愤怒值为a*(i-1)+b*(n-i),要使得所有人的愤怒值最小,输出一个排队的序列
思路
排序贪心
AC代码
class Solution {
public:
struct node {
int v, id;
node(int vv=0, int ii=0) {
v = vv; id = ii;
}
};
static bool cmp(node a, node b) {
return a.v > b.v;
}
vector<int> WaitInLine(vector<int>& a, vector<int>& b) {
vector<int> ans;
vector<node> t;
int n = a.size();
for(int i=0;i<n;i++) {
t.push_back(node(a[i]-b[i], i+1));
}
sort(t.begin(), t.end(), cmp);
for(auto v : t) {
ans.push_back(v.id);
}
return ans;
}
};
四
题目大意
有一个m*n的矩阵,每个点要么是'*'要么是'.',每个'.'可以放一个人,但是每个人的上下左右不能有人,问最多可以放几个
思路
回溯
AC代码
class Solution {
public:
int flag[10][10];
int ans;
int dir[4][2] = { 0, 1, 0, -1, 1, 0, -1, 0 };
int m, n;
void slove(vector<vector<char> >& pos, int x, int y, int cnt)
{
ans = max(ans, cnt);
for(int i=0; i<4; i++)
{
int nx = x+dir[i][0], ny = y+dir[i][1];
if(nx<0 || nx>=m || ny<0 || ny>=n) continue;
if(pos[nx][ny] == '.')
flag[nx][ny] = 1;
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
if(pos[i][j] == '.' && flag[i][j] == 0)
{
flag[i][j] = 1;
slove(pos, i, j, cnt+1);
flag[i][j] = 0;
}
}
}
}
int GetMaxStaffs(vector<vector<char> >& pos)
{
memset(flag, 0, sizeof(flag));
ans = 0;
m = pos.size(), n = pos[0].size();
for(int i=0; i<m; i++)
for(int j=0; j<n; j++)
{
if(pos[i][j] == '.')
{
flag[i][j] = 1;
slove(pos, i, j, 1);
flag[i][j] = 0;
}
}
return ans;
}
};