2022.4.19百度算法岗C++笔试
30道选择题
包含的方向有概率论、决策树、C++继承、拉格朗日乘子法、快速排序、插入排序、求矩阵特征值、二叉树、图、排列组合
简答题
搜索引擎经常会碰到匹配出来的页面具有高相似性,如果不对网页进行去重工作,会影响用户的体验,那么,网页去重的策略是什么?
系统设计题
一个网站通常存在一些恶意流量,比如说客户使用机器频繁搜索一个词条,让词条的搜索热度变高,从而使自身获益。怎么去识别这些恶意流量?
编程题
- 给一个字符串s,判断里面有多少个子串t(不区分大小写),如果有2个及两个以上的子串,则后一个子串的所有字符必须在前一个子串字符的后面。例如:
abcdesAssayEaaaassYyy有2个easy。代码如下,A100%:
#include<iostream>
#include<vector>
using namespace std;
int main(){
string str;
cin>>str;
for(int i=0; i<str.size(); i++){
if(str[i]>='A' && str[i]<='Z'){
str[i] = str[i]+32;
}
}
vector<char> want = {'e', 'a', 's', 'y'};
int wantIndex = 0;
int count = 0;
for(int i=0; i<str.size();i++){
char c = str[i];
if(c == want[wantIndex]){
wantIndex++;
if(c == 'y'){
wantIndex=0;
count++;
}
}
}
cout<<count<<endl;
}
- 小白有一支军队,n个士兵,每个士兵都有攻击力和防御力指数,而且这两个指数可能为负数。小白要从n个士兵里面选取出任意个士兵,使得选取出来的士兵攻击力、防御力之和最大,且要求军队综合性,即防御力之和、攻击力之和都不能小于零。例如5个士兵,他们的攻击力,防御力分别为:
那么,小白应该选取1、3、4号士兵,攻击力防御力之和为8。
这道题没全过,A73%,代码如下:
#include<iostream>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
int attack,defence;
vector<int> attackVec;
vector<int> defenceVec;
for(int i=0; i<n; i++){
cin>>attack>>defence;
attackVec.push_back(attack);
defenceVec.push_back(defence);
}
int attackSum=0;
int defenceSum=0;
vector<int> ansIndex;
for(int i=0; i<n; i++){
if(attackVec[i]<0 && defenceVec[i]<0) continue;
if(attackVec[i] + defenceVec[i] > 0){
if(ansIndex.size()==0 || (attackSum + attackVec[i] > 0 && defenceSum + defenceVec[i])){
ansIndex.push_back(i);
attackSum += attackVec[i];
defenceSum += defenceVec[i];
}
}
}
int sum=0;
for(int i:ansIndex){
sum += attackVec[i] + defenceVec[i];
}
cout<<sum<<endl;
}
这个思想有点蠢哈,就没用经典的解题思想,下来之后请教了一下别人,说用动态规划,但是在牛客网上讨论说dfs也不能全AC,代码如下:
#include<iostream>
#include<vector>
using namespace std;
using pii = pair<int,int>;
vector<pii> data;
int ans=0;
int n;
void dfs(int depth, int current_attack, int current_defence){
if(depth == (int)data.size()){
if(current_attack>0 && current_defence>0){
ans = max(ans, current_defence + current_attack);
}
return;
}
dfs(depth+1, current_attack+data[depth].first, current_defence+data[depth].second);
dfs(depth+1, current_attack, current_defence);
}
void solve(){
dfs(0,0,0);
cout<<ans<<endl;
}
int main() {
n=5;
data.resize(n);
data[0].first = -5;
data[1].first = 8;
data[2].first = 6;
data[3].first = 2;
data[4].first = -8;
data[0].second = 7;
data[1].second = -6;
data[2].second = -3;
data[3].second = 1;
data[4].second = -5;
solve();
return 0;
}