0
点赞
收藏
分享

微信扫一扫

2022.4.19百度算法岗C++笔试

那小那小 2022-04-20 阅读 63
算法面试

2022.4.19百度算法岗C++笔试

30道选择题

包含的方向有概率论、决策树、C++继承、拉格朗日乘子法、快速排序、插入排序、求矩阵特征值、二叉树、图、排列组合

简答题

搜索引擎经常会碰到匹配出来的页面具有高相似性,如果不对网页进行去重工作,会影响用户的体验,那么,网页去重的策略是什么?

系统设计题

一个网站通常存在一些恶意流量,比如说客户使用机器频繁搜索一个词条,让词条的搜索热度变高,从而使自身获益。怎么去识别这些恶意流量?

编程题

  1. 给一个字符串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;
}
  1. 小白有一支军队,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;
}
举报

相关推荐

0 条评论