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\n", 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\n", 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\n", 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\n", 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\n"); continue; }else if(idx < 3){ if(num[0] == num[1]){ printf("YES\n"); }else{ printf("NO\n"); } 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\n"); }else{ printf("NO\n"); } } 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\n", 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\n", 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\n", res ); } return 0; }