2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

 2017年校招全国统一模拟笔试(第二场)编程题集合-牛客网

链接:https://www.nowcoder.com/questionTerminal/276712b113c6456c8cf31c5073a4f9d7
来源:牛客网

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

输入描述:
输入为两行字符串(可能包含空格),长度均小于等于50.
输出描述:
输出为一个整数,表示最长公共连续子串的长度。
输入例子:
abcde
abgde
输出例子:
2
#include <iostream> 
#include <cstdio> 
#include <cstdlib> 
#include <cstring> 
using namespace std; 
const int MAXN = 55; 

int dp[MAXN][MAXN];   

int main(){
	int ans; 
	char st1[MAXN], st2[MAXN]; 
	cin.getline(st1, MAXN); 
	cin.getline(st2, MAXN); 
	int len1 = strlen(st1), len2 = strlen(st2);
	memset(dp, 0, sizeof(dp));  
	ans = 0; 
	for(int i=0; i<len1; ++i){
		for(int j=0; j<len2; ++j){
			if(st1[i] == st2[j]){
				dp[i+1][j+1] = max(dp[i][j]+1, dp[i+1][j+1]); 
				if( dp[i+1][j+1] > ans ){
					ans = dp[i+1][j+1]; 
				}
			}
		}
	}
	printf("%d
", ans );
	return 0; 
}

  

链接:https://www.nowcoder.com/questionTerminal/f216fb2b6fa84fcbb43537e22f1aa0d2
来源:牛客网

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

输入描述:
首先输入两个整数a,b,(-5*10^8 ≤ a ≤ b ≤ 5*10^8)
接着是一个正整数c(1 <= c <= 1000)
输出描述:
输出一个整数表示个数。
输入例子:
0 14 5
输出例子:
3
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
 
int main(){
 
    int a, b, c, start, ans, flag;
    while(scanf("%d %d %d", &a, &b, &c) != EOF){
        flag = 0;
        if(a >= 0){
            flag = 1;
        }else if(b <= 0){
            swap(a, b);
            a = -a; b = -b;
            flag = 1; 
        }else{
            ans = ((-a))/c + 1 + (b)/c;
        }
        if(flag){
            start = a;
            for( ; start <= b; ++start ){
                if(start%c == 0){
                    break;
                }
            }
            ans = (b - start)/c + 1;
        }
        printf("%d
", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/0c5d9dcb75c84551be2e162c01bc4c6a
来源:牛客网

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

输入描述:
首先输入一个正整数N,接下来的一行共有N个正整数表示每个木棒的长度。
N ≤ 50, 木棒的长度 ≤ 10000.
输出描述:
输出一个整数表示方法数。
输入例子:
5
1 2 3 4 5
输出例子:
3
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
const int MAXN = 55;
 
int valid(const int a, const int b, const int c){
    if((a+b)>c && (a+c)>b && (c+b)>a){
        return 1;
    }else{
        return 0;
    }
}
int main(){
    int n, ans, num[MAXN];
    while(scanf("%d", &n) != EOF){
        for(int i=0; i<n; ++i){
            scanf("%d", &num[i]);
        }
        ans = 0;
        for(int i=0; i<n; ++i){
            for(int j=i+1; j<n; ++j){
                for(int k=j+1; k<n; ++k){
                    if( valid(num[i], num[j], num[k]) ){
                        ans = ans + 1;
                    }
                }
            }
        }
        printf("%d
", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/2b48f56275c64de888c321aeb3492be9
来源:牛客网

牛牛在二维坐标系中画了N个点,且都是整点。现在牛牛想画出一个矩形,使得这N个点都在矩形内或者在矩形上。
矩形的边均平行于坐标轴。牛牛希望矩形的面积最小。请你帮助牛牛计算下最小矩形的面积。

输入描述:
首先输入一个正整数N表示点的个数(2 <= N <= 50)
接下来N行每行两个整数x, y,表示该点的坐标。绝对值均小于等于100.
输出描述:
一个整数表示最小矩形的面积。
输入例子:
2
0 1
1 0
输出例子:
1
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
 
int main(){
    int n, ans, x, y, min_x, min_y, max_x, max_y;
    while(scanf("%d", &n) != EOF){
        min_x = min_y = 0x3f3f3f3f;
        max_x = max_y = -0x3f3f3f3f;
        for(int i=0; i<n; ++i){
            scanf("%d %d", &x, &y);
            if(x < min_x){
                min_x = x;
            }
            if(x > max_x){
                max_x = x;
            }
            if(y < min_y){
                min_y = y;
            }
            if(y > max_y){
                max_y = y;
            }
        }
        ans = (max_y - min_y) * (max_x - min_x);
        printf("%d
", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/41cb7d4ed0254c69a06d596d89ad12a2
来源:牛客网

牛牛在研究他自己独创的平衡数,平衡数的定义是:将一个数分成左右两部分,分别成为两个新的数。
左右部分必须满足以下两点:
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
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
 
int main(){
 
    int n, idx, i, j, left_val, right_val, num[10];
    while(scanf("%d", &n) != EOF){
        idx = 0;
        while(n){
            num[idx++] = n%10;
            n /= 10;
        }
        if(idx < 2){
            printf("NO
");
            continue;
        }else if(idx < 3){
            if(num[0] == num[1]){
                printf("YES
");
            }else{
                printf("NO
");
            }
            continue;
        }
        i = 0; j = idx-1;
        left_val = 1;
        right_val = 1; 
        while(i <= j){
            if(left_val != 0 && left_val <= right_val){
                left_val = left_val * num[i++];
            }else{
                right_val = right_val * num[j--];
            }
        }
        if(right_val == left_val){
            printf("YES
");
        }else{
            printf("NO
");
        }
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/9fbb4d95e6164cd9ab52e859fbe8f4ec
来源:牛客网

牛牛有N个字符串,他想将这些字符串分类,他认为两个字符串A和B属于同一类需要满足以下条件:
A中交换任意位置的两个字符,最终可以得到B,交换的次数不限。比如:abc与bca就是同一类字符串。
现在牛牛想知道这N个字符串可以分成几类。

输入描述:
首先输入一个正整数N(1 <= N <= 50),接下来输入N个字符串,每个字符串长度不超过50。
输出描述:
输出一个整数表示分类的个数。
输入例子:
4
abcd
abdc
dabc
bacd
输出例子:
1
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
 
int main(){
 
    int n, ans;
    string st;
    while(cin>>n){
        ans = 0 ;
        map<string, int> mp;
        for(int i=0; i<n; ++i){
            cin >> st;
            sort(st.begin(), st.end());
            if(mp.find( st ) == mp.end()){
                mp[ st ] = 1;
                ans = ans + 1;
            }
        }
        printf("%d
", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/b8bc8459f0d34aaa8c1af1328cab2432
来源:牛客网

众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。

输入描述:
输入数据包括x+1行:
第一行包括三个整数x(2 ≤ x ≤ 20),n(0 ≤ n ≤ 500),m(0 ≤ m ≤ 500),以空格分隔
接下来的x行,每行一个01串item[i],表示第i个物品。每个物品的长度length(1 ≤ length ≤ 50)
输出描述:
输出一个整数,表示牛牛最多能创造多少种物品
输入例子:
3 3 1
1
00
100
输出例子:
2
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int MAXN = 505;
 
int n, m, dp[MAXN][MAXN];
 
int main(){
 
    int ans, x, cnt1, cnt0; 
    char ch[MAXN];
    while(scanf("%d %d %d", &x, &n, &m ) != EOF){
        memset(dp, 0, sizeof(dp));
        ans = 0;
        for(int i=0; i<x; ++i){
            getchar();
            scanf("%s", ch);
            cnt0 = cnt1 = 0;
            for(int j=0; j<strlen(ch); ++j){
                if(ch[j] == '0'){
                    cnt0 = cnt0 + 1;
                }else{
                    cnt1 = cnt1 + 1;
                }
            }
            for(int j=n; j>=cnt0; --j){
                for(int k=m; k>=cnt1; --k){
                    dp[j][k] = max( dp[j][k], dp[j-cnt0][k-cnt1] + 1 );
                    if(dp[j][k] > ans){
                        ans = dp[j][k];
                    }
                }
            }
        }
        printf("%d
", ans );
    }
    return 0;
}

  

链接:https://www.nowcoder.com/questionTerminal/cf00949583604f8c9f3315fd64236a8c
来源:牛客网

牛牛在书上看到一种字符串叫做回文串,当一个字符串从左到右和从右到左读都是一样的,就称这个字符串为回文串。牛牛又从好朋友羊羊那里了解到一种被称为优美的回文串的字符串,考虑一个长度为N只包含大写字母的字符串,写出它所有长度为M的连续子串(包含所有可能的起始位置的子串,相同的子串也要计入),如果这个字符串至少有K个子串都是回文串,我们就叫这个字符串为优美的回文串。现在给出一个N,牛牛希望你能帮他计算出长度为N的字符串有多少个是优美的回文串(每个位置都可以是'A'~'Z'的一个。)

输入描述:
输入数据包括三个整数N, M, K(2 ≤ N ≤ 11, 2 ≤ M ≤ N, 0 ≤ K ≤ 11).
输出描述:
输出一个整数,表示所求的字符串个数.
输入例子:
2 2 1
输出例子:
26
长度为2的字符串,它长度为2的子串只有它自身。长度为2的回文串有"AA","BB","CC"..."ZZ",一共26种。

(没有做出来,难度挺大的)(from 网友)

#include <iostream> 
#include <cstdlib> 
#include <cstdio> 
#include <cstring> 
using namespace std; 
const int MAXN = 100; 

int n, m, k,a[20]; 
long long fac[27], res; 

bool ok(int from){
	for(int i=0; i<m/2; ++i){
		if(a[from+i] != a[from + m - i- 1]){
			return false; 
		}
	}
	return true; 
}

bool ok(){
	int cnt = 0; 
	for(int i=0; i<=n-m; ++i){
		if(ok(i)){
			++cnt; 
		}
	}
	return cnt >= k; 
}

void dfs(int pos, int num){
	if(pos == n){
		if(ok()){
			res += fac[num]; 
		}
	}else{
		for(int i=0; i<num; ++i){
			a[pos] = i; 
			dfs(pos +1, num); 
		}
		a[pos] = num; 
		dfs(pos+1, num+1); 
	}
}


int main(){
	freopen("in.txt", "r", stdin); 

	while(scanf("%d %d %d", &n, &m, &k) != EOF){
		fac[0] = 1; 
		for(int i=1; i<=26; ++i){
			fac[i] = fac[i-1] * (27 - i); 
		}
		dfs(0, 0); 
		printf("%lld
", res );
	}
	return 0; 
}

  

原文地址:https://www.cnblogs.com/zhang-yd/p/6713730.html