2018 科大讯飞笔试编程题

第一题:争吵问题

有一个队列,每个人要么朝左边(L表示),要么朝右边(R表示),因为每个人都讨厌其他任何人,只要两人面对面就会发生真吵。真吵结果是胜者留在队列中,败的人移除队中。

如果序列中有多对争吵,可以任选一对,胜者留在队中,败者出局,求最后队列最少人数是多少。

例子:

LRLRLRR

输出:3

LRR。

思路:这道题找到方法了就很简单,依据题意 如果要真吵就只有  RL (两人对面)这种情况  ,其他  LL   RR   LR 都不会发生真吵。

所以我们只要从左边向右找到第一个R,从右边向左找到第一个L。那么这两人以及之间的人最终只有一个人留下。

程序代码如下:

#include<iostream>
#include<string>
int main(){
    string str;
    while(cin>>str){
        int n=str.size();
        int m=-1,k=-1;
        for(int i=0;i<n;i++)
            if(str[i]==‘R‘){
                m=i;
                break;
            }
            for(int i=n-1;i>=0;i--)
                if(str[i]==‘L‘){
                    k=i;
                    break;
                }
                if(m==-1||k==-1||k<m)
                    cout<<n<<endl;
                else
                    cout<<n-(k-m)<<endl;
    }
    return 0;
}

第二题:球队问题

有n对球队进入总决赛,现在要进行淘汰赛,每每两队都进行一场比赛,最终前n/2队进入下一轮淘汰赛。

排名规则:

球队胜一场得3分,平一场得1分,输一次得0分。

积分越高排名越前,积分相同,看净胜球数,越多越靠前,净胜球数相同,看进球数,进球越多越靠前(例子最终都会排出名次)。

求进入淘汰赛的球队。

例子:

4
A
B
C
D
A-B 3:1
A-C 2:1
A-D 0:3
B-C 5:6
B-D 1:2
C-D 1:1

输出:

D
C

程序代码如下:

#include<iostream>
#include<string>
#include<map>
#include<vector>
#include <iomanip>
using namespace std;
class score{
public:
    int cnt;       //球队编号
    int jifen;     //积分
    int jinshen;   //净胜球
    int jinqiu;    //进球数
    int fuqiu;    // 输球数
    score(){jifen=0;jinshen=0;jinqiu=0;fuqiu=0;cnt=0;}
    //void getjinshen(){jinshen=jinqiu-fuqiu;}
};

int main(){
    int n;
    while(cin>>n){
        vector<score> jj(n);
        map<string,int> a;
        map<int,string> b;
        string str;
        int cnt=0;
        for(int i=0;i<n;i++){
            cin>>str;
            a.insert(make_pair(str,cnt));    //str  对应  cnt
            b.insert(make_pair(cnt++,str));  //cnt  对应  str
        }

        for(int i=0;i<n;i++)
            jj[i].cnt=i;

        getchar();

        for(int i=0;i<n*(n-1)/2;i++){
            getline(cin,str);
            int k,k2,k3,m,f;
            k=str.find(‘-‘);
            string s1,s2,s3,s4;
            s1=str.substr(0,k);      //球队1名称
            k2=str.find(‘ ‘);
            s2=str.substr(k+1,k2-k-1);   //球队2名称
            k3=str.find(‘:‘);
            s3=str.substr(k2+1,k3-k2-1);  //球队1进球数
            s4=str.substr(k3+1);     //球队2进球数
            m=a[s1];  //球队1对应的编号
            f=a[s2];  //球队2对应的编号
            int i3=0,i4=0;
            for(int i=0; i<s3.size();i++)
            {
                i3=i3*10+s3[i]-‘0‘;
            }
            for(int i=0; i<s4.size();i++)
            {
                i4=i4*10+s4[i]-‘0‘;
            }

            jj[m].jinqiu+=i3;  //进球数
            jj[f].jinqiu+=i4;
            jj[m].fuqiu+=i4;  //输球数
            jj[f].fuqiu+=i3;

            if(i3==i4){
                jj[m].jifen+=1;
                jj[f].jifen+=1;
            }
            if(i3<i4){
                jj[f].jifen+=3;
            }else jj[m].jifen+=3;
        }
        for(int i=0;i<n;i++){
            jj[i].jinshen=jj[i].jinqiu-jj[i].fuqiu;
        }
        cout<<"==============================================================================="<<endl;
        cout<<setw(16)<<"球队名"<<setw(8)<<"积分"<<setw(10)<<"净胜球"<<setw(10)<<"进球数"<<endl;
        for (int i=0;i<n;i++){
            cout<<setw(16)<<b.at(i)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl;
        }
        cout<<"==============================================================================="<<endl;
        for(int i=0;i<n-1;i++){
            int u=i;
            for(int j=i+1;j<n;j++){
                if(jj[j].jifen>jj[u].jifen)
                    u=j;
                else if(jj[j].jifen==jj[u].jifen){
                    if(jj[j].jinshen>jj[u].jinshen)
                        u=j;
                    else
                        if(jj[j].jinqiu>jj[u].jinqiu)
                            u=j;
                }
            }
            score temp;
            temp=jj[i];
            jj[i]=jj[u];
            jj[u]=temp;
        }
        cout<<"排名后"<<endl;
        cout<<"==============================================================================="<<endl;
        cout<<setw(16)<<"球队名"<<setw(8)<<"积分"<<setw(10)<<"净胜球"<<setw(10)<<"进球数"<<endl;
        for (int i=0;i<n;i++){
            cout<<setw(16)<<b.at(jj[i].cnt)<<setw(8)<<jj[i].jifen<<setw(10)<<jj[i].jinshen<<setw(10)<<jj[i].jinqiu<<endl;
        }
        cout<<"==============================================================================="<<endl;

        cout<<"前"<<n/2<<"名球队"<<endl;
        for(int i=0;i<n/2;i++){
            str=b.at(jj[i].cnt);
            cout<<str<<endl;
        }

    }
    return 0;
}
时间: 2024-10-06 01:10:09

2018 科大讯飞笔试编程题的相关文章

美团点评2017秋招笔试编程题

美团点评2017秋招笔试编程题 1, 大富翁游戏,玩家根据骰子的点数决定走的步数,即骰子点数为1时可以走一步,点数为2时可以走两步,点数为n时可以走n步.求玩家走到第n步(n<=骰子最大点数且是方法的唯一入参)时,总共有多少种投骰子的方法. 题解: 写出前面的几个, 1 -> 1;   2 -> 2 ;  3 -> 4;   4 -> 8; 5 -> 16; 6 -> 32; 可以得到是 二的 n-1 次幂. #include <cstdio> int

小米2015笔试编程题

小米2015笔试编程题 1.[编程题] 懂二进制 时间限制:1秒 空间限制:32768K 世界上有10种人,一种懂二进制,一种不懂.那么你知道两个int32整数m和n的二进制表达,有多少个位(bit)不同么? 输入例子1: 1999  2299 输出例子1: 7 分析:第一步求这两个数的异或,得到一个新的数,相同位是0,不同位是1:第二步采用位运算求这个数里边1的个数即为结果 1 class Solution { 2 public: 3 /** 4 * 获得两个整形二进制表达位数不同的数量 5

小米13笔试编程题 1

数组乘积(15分) 输入:一个长度为n的整数数组input 输出:一个长度为n的整数数组result,满足result[i] = input数组中除了input[i]之外所有数的乘积(假设不会溢出).比如输入:input = {2,3,4,5},输出result = {60,40,30,24} 程序时间和空间复杂度越小越好. C/C++: int *cal(int* input , int n); Java: int[] cal(int[] input); 方法1:算出数组所有元素乘积sum,再

小米13笔试编程题 4

朋友圈(25分) 假如已知有n个人和m对好友关系(存于数字r).如果两个人是直接或间接的好友(好友的好友的好友...),则认为他们属于同一个朋友圈,请写程序求出这n个人里一共有多少个朋友圈. 假如:n = 5 , m = 3 , r = {{1 , 2} , {2 , 3} , {4 , 5}},表示有5个人,1和2是好友,2和3是好友,4和5是好友,则1.2.3属于一个朋友圈,4.5属于另一个朋友圈,结果为2个朋友圈. 最后请分析所写代码的时间.空间复杂度.评分会参考代码的正确性和效率. C/

小米13笔试编程题 2

有一个数组(非递减),旋转了不知道多少个位,在该数组中找一个数的下标.写出代码(用C/C++或者java) 并分析时间空间复杂度,考虑效率(很重要). eg:数组 [6,7,1,2,3,4,4] 找3,返回4: 函数原型 C/C++: int find(int * a,int n,int count) count为a数组长度;n为要查找的数 Java: int find(int []a,int n) 方法:二分查找,插值查找,Fibonacci查找 二分查找如下: #include<iostre

2017年腾讯 秋招软件开发笔试编程题回忆版

2017年腾讯秋招软件开发笔试编程题回忆版 (所有题目大致描述如下,并非完整的题目回忆,但意思大致一样) 1.又一个魔法城市,城市里面有n个魔法城堡,序号为0,1,2...n-1:魔法城堡之间都有路径相连:魔法城堡两两之间的到达的距离不同,因此所需时间也可能不会相同.如魔法城堡0到魔法城堡2需要耗时4小时:现,小明想从魔法城堡0到魔法城堡1,他想知道需要花费多少时间:为了快速到达,有一魔法扫把,魔法扫把使用次数有限,使用一次,可以将某一段间的时间减半:求小明从魔法城堡0到魔法城堡1花费的最小时间

笔试编程题必杀技——动态规划

在笔试编程题中,最常见题型莫过于动态规划了,以前一直不太清楚,今天下定决心好好梳理一番. 动态规划是通过组合子问题的解决而解决整个问题的,一个大问题分解成一个小问题,这个小问题再分成小问题,以此类推,直至求出最终结果. 首先看一个把我虐了无数遍的问题:最大子数组的问题. 题目:一个有N个整数元素的一位数组(A[0], A[1],...,A[n-1], A[n]),这个数组当然有很多子数组,那么数组之和的最大值是什么呢? 例如:有数组int A[5] = {-1, 2, 3, -4, 2}:符合条

2018阿里巴巴在线编程题

在其他博客上看到一道 "2018阿里巴巴在线编程题" 我记得题目大概是这样的:输入数据n(n>=6)代表n个数,从0-9任意输入n个数,然后在n个数选出6个数xx-xx-xx表示 时:分:秒,求出最小时间和最大时间,若时间无效,则输出时间无效,例如: 输入: 6 6 5 4 3 2 1 输出: 123456 235641 输入: 6 9 9 9 9 9 9 输出: 时间无效 看着有点意思,就自己做了一遍,输出格式自己美化了一下,没有严格按照题目要求.代码如下: def find_

360笔试编程题

360笔试题目: C++简单实现: 1 #include <stdio.h> 2 #include <iostream> 3 #include <math.h> 4 #include <sstream> 5 #include <cstring> 6 #include <vector> 7 #include <algorithm> 8 9 using namespace std; 10 11 12 const int MAX