中科大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