• 牛客网——2017校招第二场编程题汇总


    1. 最长公共连续子串

    牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度。

    输入描述:

    输入为两行字符串(可能包含空格),长度均小于等于50.

    输出描述:

    输出为一个整数,表示最长公共连续子串的长度。

    输入例子:

    abcde

    abgde

    输出例子:

    2

    完整的C++代码如下:

    #include<iostream>
    //这段代码没有考虑空格问题,读者可以自行加上,写一个去除空格的函数,将原串
    //变成一个新串
    using namespace std;
    
    int main()
    {
        char s1[50];
        char s2[50];
        gets_s(s1);
        gets_s(s2);
        int getMaxLength(char *string1, char *string2);
        cout << getMaxLength(s1, s2) << endl;
        return 0;
    }
    
    int getMaxLength(char *string1, char *string2)
    {
        int a, b, m, Max=0;
        int max;
        int lastMax[50] = { 0 };//记录每一个元素对应的最长连续子串的长度
        int num[50] = { 0 };  //记录每一次内层遍历的结果
        int i, j;
        
        int s1len = strlen(string1);
        int s2len = strlen(string2);
        for (i = 0; i < s1len; i++)
        {
            
            for (j = 0; j < s2len; j++)
            {
                a = i;
                b = j;
                int count = 0;
                while (string1[a] == string2[b]&&a!=s1len&&b!=s2len)
                {
                    count++;
                    a++;
                    b++;
                }
                num[j] = count;//记录每一次内层遍历的结果
                
            }
            
            for ( max=0,m = 0; m < s2len;)
            {
                while (max < num[m])
                {
                    max = num[m];
                    
                }
            }
            lastMax[i] = max;//记录每一个元素对应的最长连续子串的长度
        }
            
        for (m = 0; m < s1len; ) //取出最大的连续子串的长度
        {
            if (Max < lastMax[m])
            {
                Max = lastMax[m];
                
            }
        }
        //cout << max << endl;
        return Max;
    }

     

    测试结果如下:

     2.找整除

    牛牛想在[a, b]区间内找到一些数满足可以被一个整数c整除,现在你需要帮助牛牛统计区间内一共有多少个这样的数满足条件?

    输入描述:

    首先输入两个整数a,b,(-5*10^8 ≤ a ≤ b ≤ 5*10^8)

    接着是一个正整数c(1 <= c <= 1000)

    输出描述:

    输出一个整数表示个数。

    输入例子:

    0 14 5

    输出例子:

    3

    #include<iostream>
    using namespace std;
    void getExactDivision(long long int a, long long int b, long int c)
    {
        int num_an = 0;
        int num_bn = 0;
        num_bn = b / c;//求出倍数    
        num_an = a / c;
        if (a != 0)//判断是否为0    
        {
            if (b / a<0)//说明 异号        
            {
                cout << (num_bn - num_an + 1);
            }
            else
                cout << (num_bn - num_an);
        }
        else if (a == 0)
        {//等于0        
            cout << (num_bn - num_an + 1);
        }
    }
    
    
    int main()
    {
        long long int min_an, max_bn;
        cin >> min_an >> max_bn;//输入范围    
        long int num_cn;
        cin >> num_cn;
        //输入c    
        getExactDivision(min_an, max_bn, num_cn);
        return 0;
    }

    测试结果如下:

     3. 组装三角形

    牛牛手里有N根木棒,分别编号为1~N,现在他从N根里想取出三根木棒,使得三根木棒构成一个三角形,你能计算出牛牛有多少种取法吗?(考虑两种取法中使用的木棒编号有一个不一样就认为是不同的取法)。

    输入描述:

    首先输入一个正整数N,接下来的一行共有N个正整数表示每个木棒的长度。

    N ≤ 50, 木棒的长度 ≤ 10000.

    输出描述:

    输出一个整数表示方法数。

    输入例子:

    5

    1 2 3 4 5

    输出例子:

    3

    说明:要单独判断三角成形的条件,就比较方便。我这里用的最麻烦的多重遍历暴力枚举,应该还有好一些的方法。  

    完整代码如下:

    #include<iostream>
    using namespace std;
    
    bool isAngle(int a, int b, int c)
    {
        bool flag = false;
        if (a<b + c && b<a + c && c<a + b)
        {
            flag = true;
        }
        return flag;
    }
    
    int AssembleTriangle(int N, int Len[50])
    {
        int count = 0;
        for (int i = 1; i <=N; i++)
        {
            for (int j = i + 1; j<=N; j++)
            {
                for (int k = j + 1; k<=N; k++)
                {
                        int a = Len[i];
                        int b = Len[j];
                        int c = Len[k];
                        if (isAngle(a, b, c))
                        {
                          count++;
                         }
                }
            }
        }
        return count;
    }
    
    int main()
    {
        int num;
        cin >> num;
        int i = 0;
        int length[50] = { 0 };
        for (i = 1; i <= num; i++)
            cin >> length[i];
        cout << AssembleTriangle(num, length) << endl;
        return 0;
    }

    测试结果如下:

     4.最小的矩形面积

    牛牛在二维坐标系中画了N个点,且都是整点。现在牛牛想画出一个矩形,使得这N个点都在矩形内或者在矩形上。

    矩形的边均平行于坐标轴。牛牛希望矩形的面积最小。请你帮助牛牛计算下最小矩形的面积。

    输入描述:

    首先输入一个正整数N表示点的个数(2 <= N <= 50)

    接下来N行每行两个整数x, y,表示该点的坐标。绝对值均小于等于100.

    输出描述:

    一个整数表示最小矩形的面积。

    输入例子:

    2

    0 1

    1 0

    输出例子:

    1

    说明:主要是锁定范围,x轴的长度的最大值乘以y轴的长度的最大值,就是要求解的面积。  

    完整代码如下:

    #include<iostream>
    using namespace std;
    
    int getSmallRectangleArea(int xlabel[50], int ylabel[50],int N)
    {
        int xMax = -65536;
        int xMin = 65536;
        for (int i = 1; i<=N; i++)
        {
            if (xlabel[i] > xMax)
            {
                xMax = xlabel[i];
            }
            if (xlabel[i] < xMin)
            {
                xMin = xlabel[i];
            }
        }
        int xLen = xMax - xMin;
    
        int yMax = -65536;
        int yMin = 65536;
        for (int i = 1; i<=N; i++)
        {
            if (ylabel[i] > yMax)
            {
                yMax = ylabel[i];
            }
            if (ylabel[i] < yMin)
            {
                yMin = ylabel[i];
            }
        }
        int yLen = yMax - yMin;
        int area = xLen * yLen;
        return area;
    }
    
    int main()
    {
        int N;
        cin >> N;
        int x[50], y[50];
        for (int i = 1; i <= N; i++)
            cin >> x[i] >> y[i];
        cout << getSmallRectangleArea(x, y, N) << endl;;
        return 0;
    }

    测试结果如下:

     5. 平衡数

    牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。

     左右部分必须满足以下两点:

             1,左边和右边至少存在一位。

             2,左边的数每一位相乘如果等于右边的数每一位相乘,则这个数称为平衡数。

    例如:1221这个数,分成12和21的话,1*2=2*1,则称1221为平衡数,再例如:1236这个数,可以分成123和1*2*3=6,所以1236也是平衡数。而1234无论怎样分也不满足平衡数。

    输入描述:

    输入一个正整数(int范围内)。

    输出描述:

    如果该数是平衡数,输出 "YES", 否则输出 "NO"。

    输入例子:

    1221

    1234

    输出例子:

    YES

    NO

    说明:先将数字按位存放在vector中,在分为两部分分别求解,比较,相等则输出“YES”,没有的话,输出“NO”。

    完整代码如下:

    #include<iostream>
    #include<vector>
    using namespace std;
    
    void BalanceNum(int Num)
    {
        vector<int> vec;
        while (Num)
        {
            int aa;
            aa = Num % 10;
            vec.push_back(aa); //按位放入数组中
            Num = Num / 10;
        }
        //只有一个数字时,输出“NO”
        if (vec.size() == 1)
        {
            cout << "NO" << endl;
            return;
        }
        for (int i = 0; i<vec.size(); i++)
        {
            int begin = 1;
            int end = 1;
            //开始到变量i之间的数字的乘积
            for (int j = 0; j<i; j++)
            {
                begin *= vec[j];
            }
            //变量i到结束数字的乘积
            for (int k = i; k<vec.size(); k++)
            {
                end *= vec[k];
            }
            //存在相等的情况输出“YES”,并结束所有判断
            if (begin == end)
            {
                cout<<"YES"<<endl;
                return;
            }
        }
        cout << "NO" << endl;
    }
    
    int main()
    {
        int N;
        cin >> N;
        BalanceNum(N);
        return 0;
    }

    测试结果如下:

    6. 字符串分类 

    牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:

    A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。

     现在牛牛想知道这N个字符串可以分成几类。

    输入描述:

    首先输入一个正整数N(1 <= N <= 50),接下来输入N个字符串,每个字符串长度不超过50。

    输出描述:

    输出一个整数表示分类的个数。

    输入例子:

    4

    abcd

    abdc

    dabc

    bacd

    输出例子:

    1

    说明:采用vector对原始输入的字符串进行存储,排序,然后在将排好的字符串插入到set中,重复元素不再插入,所以最终set的size就是原始字符串的分类数

    #include<iostream>
    #include<string>
    #include<vector>
    #include<set>
    #include<algorithm>
    
    using namespace std;
    
    int main()
    {
        int N;
        cin >> N;
        vector<string> s(N);
        set<string> s1;
        for (int i=0; i < N; i++)
            cin>>s[i];
        for (int i = 0; i < N; i++)
            sort(s[i].begin(), s[i].end());
        for (int i = 0; i < N; i++)
            s1.insert(s[i]);   //执行set的插入操作,重复元素不再插入
        cout << s1.size() << endl;
        return 0;
    
    }


    测试结果如下:

  • 相关阅读:
    hdu 5918(强行水过去..正解KMP)
    hdu 5914(斐波拉契数列)
    hdu 5912(迭代+gcd)
    bzoj 2819(DFS序+树状数组+博弈+lca)
    BestCoder #88(1001 1002)
    hdu 5468(dfs序+容斥原理)
    hdu 5692(dfs序+线段树,好题)
    dfs序题目练习
    csu 1806 & csu 1742 (simpson公式+最短路)
    LuoGuP3774:[CTSC2017]最长上升子序列
  • 原文地址:https://www.cnblogs.com/lxt1105/p/6653915.html
Copyright © 2020-2023  润新知