中科大2008年复试机试题

Posted 落幕·重逢

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中科大2008年复试机试题相关的知识,希望对你有一定的参考价值。

中科大2008年复试机试题

文章目录

第一题

问题描述

一个十进制正整数转换成二进制有多少个1
示例1

输入:10
输出:2

解题思路及代码

将输入的数字当做字符串处理会简单点。与Leetcode上的题目一致

#include <iostream>
using namespace std;
int main()

    int n, count = 0;
    cin >> n;
    for(int i = 0; i < 32; i++)
    
        count += (n & 1);
        n >>= 1;
    
    cout<<count<<endl;
    return 0;

第二题

问题描述

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知 n 个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为 k 的人开始报数,数到 m 的那个人出圈;他的下一个人又从 1 开始报数,数到 m 的那个人又出圈;依此规律重复下去,直到剩余最后一个胜利者。
示例 1

输入:10  3  1
输出:4
解析:
(1)开始报数,第一个数到 3 的人为 3 号,3 号出圈。
  1, 2, 【3】, 4, 5, 6, 7, 8, 9, 10。
(2)从4号重新从1开始计数,则接下来数到3的人为6号,6号出圈。
  1, 2, 【3】, 4, 5, 【6】, 7, 8, 9, 10。
(3)从7号重新从1开始计数,则接下来数到3的人为9号,9号出圈。
  1, 2, 【3】, 4, 5, 【6】, 7, 8, 【9】, 10。
(4)从10号重新从1开始计数,由于10个人称环形结构,则接下来数到3的人为2号,2号出圈。
  1, 【2】, 【3】, 4, 5, 【6】, 7, 8, 【9】, 10。
(5)从4号重新从1开始计数,则接下来数到3的人为7号,7号出圈。
  1, 【2】, 【3】, 4, 5, 【6】, 【7】, 8, 【9】, 10。
(6)从8号重新从1开始计数,则接下来数到3的人为1号,1号出圈。
  【1】, 【2】, 【3】, 4, 5, 【6】, 【7】, 8, 【9】, 10。
(7)从4号重新从1开始计数,则接下来数到3的人为8号,8号出圈。
  【1】, 【2】, 【3】, 4, 5, 【6】, 【7】, 【8】, 【9】, 10。
(8)从10号重新从1开始计数,则接下来数到3的人为5号,5号出圈。
  【1】, 【2】, 【3】, 4, 【5】, 【6】, 【7】, 【8】, 【9】, 10。
(9)从10号重新从1开始计数,则接下来数到3的人为10号,10号出圈。
  【1】, 【2】, 【3】, 4, 【5】, 【6】, 【7】, 【8】, 【9】, 【10】。
(10)最终剩余 4 号,4 号为胜利者。

解题思路及代码

用数组求解的基本思想就是用一个一维数组去标识这 n 个人的状态,默认全为 1 ,也就是都在圈子内,当数到 m的人出圈之后,标识置为 0(就是出圈了),同时报数器清 0,下一个人要从 1 开始。在每次报数之前要判断他是否在圈子内(也就是他的标识是否为 1 ),如果在圈子里面才会继续报数。定义一个变量记录出圈的人数, 出圈的人数等于 n-1 时,则游戏结束。

#include <iostream>
#include <vector>
using namespace std;
int main()

    int n,m,k;
    cin>>n>>m>>k;//输入玩游戏人数n、计数m以及起始报数位置
    vector<int> flag(n,1);//标记每个人当前状态
    int count = 0;//记录已经出圈的人数
    int cur = k-1;//起始报数位置
    int num = 0;//计算在圈中的人数
    while(count < n-1)
    
        if(flag[(cur+num)% n] == 1)
        
            if(num == m-1)
            
                cout<<(cur+num+1)%n<<endl;
                flag[(cur+num)%n] = 0;//此人数到m则出圈
                cur = (cur+num+1)%n;
                num = 0;
                count++;

            
            else
            
                num++;
            
        
        else
        
            cur = (cur+1)%n;
        

    
    for(int i = 0; i < n; i++)
    
        if(flag[i] == 1)
        
            cout<<i+1<<endl;
        
    
    return 0;

若想更进一步了解这个问题可以点击参考此内容: 算法科普:什么是约瑟夫环

第三题

问题描述

求矩阵的转置。

示例 1

输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]

解题思路及代码

与2006年第一题一致,此处不再写出,有需要可以点击查看中科大2006年复试机试题

第四题

问题描述

字符串问题。从文件4.in中读入几行英文句子。输出每个单词出现的个数,并且按照字典索引输出到控制台。
示例1

输入:
I am
a student from china
china
am student
输出:
I 1
a 1
am 2
china 2
from 1
student 2

解题思路及代码

利用map进行计数。

#include <iostream>
#include <fstream>
#include <map>
using namespace std;
int main()

    ifstream ifs("./4.in.txt");
    map<string,int> ans;
    string tmp;
    while(ifs >> tmp)
    
        ans[tmp]++;
    
    for(auto it:ans)
    
        cout << it.first <<" "<< it.second << endl;
    
    return 0;

该机试题所有代码均已上传,下载地址: https://download.csdn.net/download/LOVE_105/87382291

以上是关于中科大2008年复试机试题的主要内容,如果未能解决你的问题,请参考以下文章

中科大-计算机类考研真题(初试笔试真题详解+复试笔试机试真题详解+面试问题汇总分析)

1027: 逃离迷宫(2018年中南大学研究生复试机试题)

1022: 淘金(2017年中南大学研究生复试机试题 )

1008: 最大连续子序列(2014年中南大学研究生复试机试题 )

1023: 巨人排队(2017年中南大学研究生复试机试题 )

1028: 安全路径(2014年中南大学研究生复试机试题 )