牛客网——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;

}


测试结果如下:

 

posted @ 2017-03-31 22:42  walanwalan  阅读(1773)  评论(0编辑  收藏  举报