3.21 贝壳C++研发工程师 笔试题答案

3.21 贝壳C++研发工程师 笔试题答案

第一题:s字符串,划分为几个连续的字符数组,字符为偶数个的时候,val+1,字符为奇数个的时候,val-1,最后输出最大的val。
emmm,听大佬说第一题用动态规划的方法,具体还没想清楚,欢迎大佬们在评论里解答,谢谢!

第二题:判断[l,r]中间的自余数的个数。
思路:采用打表的方法,提前存储1~1e6的自余数。
代码:
#include <bits/stdc++.h>
using namespace std;
int a[27455];//27455是1~1e6的自余数的个数
int main ()
{
    int t;
    int l,r;
    cin>>t;
    int j = 0;
    for(int i=1; i<=1000000; i++) //打表
    {
        int tmp = i;
        int zhi;
        long long sum = 0;
        while(tmp > 0)
        {
            zhi = tmp % 10;
            sum += zhi;
            tmp /= 10;
        }
        if(i % sum == 1)
        {
            a[j++] = i;
        }
    }
    for(int i=1;i<20;i++)
        cout<<a[i]<<" ";

    while(t--) // 1000
    {
        cin>>l>>r;
        int left = 0,right = 0;
        int ans = 0;
        for(int i=0; i<27455; i++)
        {
            if(a[i] <= l)
            {
                left = i;
            }
            if(a[i]<= r)
            {
                right = i;
            }
        }
        ans = right - left + 1;
        //for(int i=0;i<j;i++)
        //cout<<a[i]<<" ";
        //cout<<j<<endl;
        cout<<ans<<endl;
    }
    return 0;
}
/*
3
11 11
13 13
1 20
*/
第三题:字符匹配,在一个n*n的字符矩阵从上往下或者从左往后找到与字符串s匹配的字符串的个数。
思路:暴力的方法,先寻找从左往右匹配的字符个数,再寻找从上往下匹配的个数。
代码:
#include <bits/stdc++.h>
using namespace std;

char a[110][110];
int main ()
{
    int n;
    cin >>n;
    string s;
    cin>>s;
    int str = s.size();
    //getchar();
    for(int i=0; i<n; i++)
    {
        for(int j=0; j<n; j++)
        {
            cin>>a[i][j];
        }
    }
    long long ans = 0;

    string tmp;
    for(int i=0; i<=n-1; i++)
    {
        for(int j=0; j<=n-str; j++)
        {
            //if(a[i][j] == s[k])
            for(int k=0; k<str; k++)
            {
                tmp += a[i][j+k];//从左往右
            }
            if(tmp == s)
            {

                ans++;
            }
            tmp = "";
        }
    }

    tmp = "";
    for(int j=0; j<=n-1; j++)
    {
        for(int i=0; i<=n-str; i++)
        {
            for(int k=0; k<str; k++)
            {
                tmp += a[i+k][j];//从上往下
            }
            if(tmp == s)
            {
                ans++;
            }
            tmp = "";
        }
    }
    cout<<ans<<endl;
    return 0;
}
/*
3
abc
xax
abc
xcx

*/
#笔试题目##贝壳找房#
全部评论
第三题暴力解没过,不知道为什么,纯无语
点赞 回复 分享
发布于 2022-03-21 23:05
第二题,可以在输入的时候维护一个最大最小值,这样就有明确的打表区间了
点赞 回复 分享
发布于 2022-03-21 23:00
我第二题也想到打表了,但是突然没想到好方法从表中获取到左边界和右边界,第一反应是二分查找,但是没时间写了
点赞 回复 分享
发布于 2022-03-21 22:15

相关推荐

06-10 21:15
门头沟学院 Java
宁阿:好多这种没🧠的公司,他们估计都不知道毕业的人不能给安排实习岗
实习吐槽大会
点赞 评论 收藏
分享
评论
3
6
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务