• 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; 
    }
    

      

  • 相关阅读:
    MySQL系列
    Python小白之路
    nrm安装使用(mac)
    npm 发布一个包(已有自己私服的情况)
    vuex简单使用
    在vue中使用ztree树插件
    题库1
    设计模式读书笔记
    ORM框架学习之EF
    net+Oracle开发过程中遇到的小问题
  • 原文地址:https://www.cnblogs.com/zhang-yd/p/6713730.html
Copyright © 2020-2023  润新知