9.29奇安信笔试

题1:5进制和10进制的转换
#include <bits/stdc++.h>
using namespace std;

unordered_map<char, int> m1 = {{'o', 0}, {'y', 1}, {'e', 2}, {'a', 3}, {'s', 4}};
unordered_map<int, char> m2 = {{0, 'o'}, {1, 'y'}, {2, 'e'}, {3, 'a'}, {4, 's'}};

//5转10
int ftot(string& s){
    int i = s.size() - 1;
    int res = 0;
    for(auto& t : s){
        res += m1[t] * pow(5, i);
        i--;
    }
    return res;
}

//10转5
string ttof(string& s){
    int t = stoi(s);
    string res;
    while(t){
        res += m2[t % 5];
        t /= 5;
    }
    reverse(res.begin(), res.end());
    return res;
}

int main(){
    int n;
    cin >> n;
    while(n--){
        string s;
        cin >> s;
        if(!(s[0] >= '0' && s[0] <= '9')){
            cout << ftot(s) << endl;
        }
        else{
            cout << ttof(s) << endl;
        }
    }
    return 0;
}
题2:有多少种方法从左上角走到右下角,dfs,代码忘记存了
题3:给你一个只包含01的字符串,统计有多少个子串满足连续1的个数是最大,不会,只能暴力,当然是过不了了QAQ
#include <bits/stdc++.h>
using namespace std;
const int MOD = 1e10 + 7;
int res = 0;
int total = 0;

int onesum(const string& s){
    int i = 0;
    int res = 0;
    int l = 0;
    for(int i = 0; i != s.size(); i++){
        if(s[i] == '1') l++;
        else l = 0;
        res = max(res, l);
    }
    return res;
}


int check(const string s, int sum){
    int i = 0;
    int res = 0;
    int l = 0;
    for(int i = 0; i != s.size(); i++){
        if(s[i] == '1') l++;
        else l = 0;
        res = max(res, l);
    }
    return res == sum;
}

void dfs(string& s, int index){
    if(index == s.size()){
        return;
    }
    for(int i = index; i != s.size(); i++){
        if(check(s.substr(index, i - index + 1), total)){
            res = (res + 1) % MOD;
        }
        dfs(s, i + 1);
    }
}

int main(){
    int n;
    cin >> n;
    string s;
    cin >> s;
    total = onesum(s);
    dfs(s, 0);
    cout << res << endl;
    return 0;
}



#奇安信笔试#
全部评论
前面填空感觉错了几道,算法AC两道,不知道有没有机会
点赞 回复 分享
发布于 2022-09-29 21:20 广东

相关推荐

10-27 17:26
东北大学 Java
点赞 评论 收藏
分享
2 收藏 评论
分享
牛客网
牛客企业服务