中科大2006年复试机试题
文章目录
- 中科大2006年复试机试题
- 第一题
- 问题描述
- 解题思路及代码
- 第二题
- 问题描述
- 解题思路及代码
- 第三题
- 问题描述
- 解题思路及代码
- 第四题
- 问题描述
- 解题思路及代码
- 第五题
- 问题描述
- 解题思路及代码
- 第六题
- 问题描述
- 解题思路及代码
第一题
问题描述
求矩阵的转置。
给一个二维整数数组 matrix, 返回 matrix 的 转置矩阵。
示例 1
输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]
输出:[[1,4,7],[2,5,8],[3,6,9]]
解题思路及代码
矩阵的第i行为转置的第i列,与Leetcode上的题目一致
#include<iostream>
using namespace std;
int main()
{
int m,n;
cout<<"输入行数:";
cin>>m;
cout<<"输入列数:";
cin>>n;
int matrix[m][n];
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
cin>>matrix[i][j];
}
}
int matrix1[n][m];
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
matrix1[j][i] = matrix[i][j];
}
}
for(int i = 0; i < n; i++)
{
cout<<endl;
for(int j = 0; j < m; j++)
{
cout<<matrix1[i][j];
}
}
return 0;
}
第二题
问题描述
写一个程序,判断C语言中的变量命名是否合法。
示例 1
输入:hello@
输出:true
解题思路及代码
变量合法条件:
1.变量名可以由字母,数字或下划线组成
2.变量名只能以字母或下划线开头
isalpha( c ):判断是否为字母
isdigit( c ):判断是否为数字
#include <iostream>
using namespace std;
bool isValid(string s)
{
if(!(isalpha(s[0])||s[0]=='_'))
return false;
for(int i = 1;i < s.size();i++)
{
if(!(isalpha(s[i])||s[0]=='_'||isdigit(s[i])))
return false;
}
return true;
}
int main()
{
string s;
cin>>s;
cout<<isValid(s)<<endl;
return 0;
}
第三题
问题描述
编写一程序,将中缀表达式转化为后缀表达式(含括号情况)。从expr.in文件中读取输入,将结果输出到expr.out文件中。
示例 1
输入:a-b*(c+d)
输出:abcd+*-
解题思路及代码
即将中缀表达式转换为后缀表达式。只使用一个栈来存储算符,并且用一个表来存储算符的优先级。当遇到运算数时直接输出,遇到算符时根据规则压入栈或者输出。
priority[‘(’] = 0;
priority[‘+’] = priority[‘-’] = 1;
priority[‘*’] = priority[‘/’] = 2;
#include <fstream>
#include <stack>
#include <unordered_map>
#include <vector>
#include<iostream>
using namespace std;
int main()
{
ifstream ifs("./expr.in.txt");
ofstream ofs("./expr.out.txt");
vector<char> v;
stack<char> opStk;
unordered_map<char, int> priority;
priority['('] = 0;
priority['+'] = priority['-'] = 1;
priority['*'] = priority['/'] = 2;
char c;
while(ifs >> c)
v.push_back(c);
for(char c: v)
{
if(isalpha(c))
{
ofs<<c;
cout<<c<<endl;
}
else if(c == '(')
{
opStk.push(c);
}
else if(c == ')')
{
char ch = opStk.top();
while(ch != '(')
{
opStk.pop();
ofs << ch;
ch = opStk.top();
}
opStk.pop();
}
else
{
while (!opStk.empty() && priority[c] < priority[opStk.top()])
{
char op = opStk.top();
opStk.pop();
ofs << op;
}
opStk.push(c);
}
}
while (!opStk.empty())
{
char ch = opStk.top();
opStk.pop();
ofs << ch;
}
return 0;
}
第四题
问题描述
给定两个数m和n,实现如下功能:如m=3,n=4时,输出
1 2 3
1 2 4
1 3 4
2 3 4
解题思路及代码
其实没太懂这个题的意思,只能凭感觉完成,理解成1~n所有的三个数的全排序。
#include <iostream>
using namespace std;
int main() {
int m, n;
cin >> m >> n;
for(int i = 0; i < m; i++)
{
for(int j = i+1; j < n;j++)
{
for(int k = j+1; k < n;k++)
{
cout<<i+1<<" "<< j+1<<" "<<k+1<<endl;
}
}
}
return 0;
}
第五题
问题描述
给定一无向图的矩阵存储,求其最大连通分量。图的信息存储在文件graph.in中,文件的第一行给无向图的顶点数量n和边数k,顶点序号从0到n-1,接下来分别给出k条边的两个顶点号。输出无向图中的最大连通分量的所有顶点号,输出到文件graph.out中。
示例 1
输入:
10 6
0 1
0 2
4 5
4 6
5 7
8 9
输出:4 5 7 6
解题思路及代码
该题的意思是求连通分量,故可采用DFS来求连通分量。设置visit数组标记该顶点是否访问过,然后按照顶点序号从小到大的顺序用dfs来遍历所有的连通分量,并且保存最大的连通分量中的所有顶点。
#include<fstream>
#include<iostream>
#include<vector>
using namespace std;
int dfs(vector<vector<int>> &g, vector<int> &vis, vector<int> &tmp,int idx, int n)
{
if(vis[idx])
return 0;
else
{
vis[idx] = 1;
tmp.push_back(idx);
int ans = 1;
for(int i = 0; i < n; i++)
{
if(g[idx][i])
ans+=dfs(g,vis,tmp,i,n);//深度优先遍历计算连通分量个数
}
return ans;
}
}
int main()
{
ifstream ifs("./graph.in.txt");
ofstream ofs("./graph.out.txt");
int n,m;
ifs>>n>>m;
cout<<n<<" "<<m<<endl;
vector<vector<int>> g(n,vector<int>(n,0));
vector<int>vis(n,0);
vector<int>ans,tmp;
int maxval = 0,tmpval = 0;
for(int i = 0; i < m; i++)
{
int c1,c2;
ifs>>c1>>c2;
g[c1][c2] = g[c2][c1] = 1;//构造图
}
for(int i = 0; i < n; i++)
{
if(vis[i] == 0)
{
int tmpval = dfs(g,vis,tmp,i,n);
if(tmpval > maxval)
{
maxval = tmpval;
ans = tmp;
}
tmp.clear();
}
}
for(int i = 0; i < ans.size();i++)
{
ofs<<ans[i]<<" ";
}
return 0;
}
第六题
问题描述
求连续子数组的最大和,比如[-2,1,-3,4,-1,2,1,-5,4]中的连续子数组[4,-1,2,1]的和最大,为6。数组中的数字保存在文件number.in中,求出结果输出到文件number.out中。
示例 1
输入:-2 1 -3 4 -1 2 1 -5 4
输出:6
解题思路及代码
这是一道比较典型动态规划的题目。
我们可以设数组为nums,动态规划列表为dp,则dp[i]表示以第i个元素结尾的子数组的最大和,dp满足如下递归公式:
dp[i] = dp[i-1]+nums[i] (当dp[i-1]>0时)
dp[i] = nums[i] (当dp[i-1]<0时)
此题与与Leetcode上的题目一致
#include<fstream>
#include<vector>
#include<iostream>
using namespace std;
int main()
{
ifstream ifs("./number.in.txt");
ofstream ofs("./number.out.txt");
vector<int> nums;
int num;
while(ifs>>num)
{
nums.push_back(num);
}
int n = nums.size();
vector<int>dp(n,nums[0]);
int ans = nums[0];
for(int i = 1; i < n ; i++)
{
dp[i] = (dp[i-1]>0)?dp[i-1]+nums[i]:nums[i];
ans = (ans>dp[i])?ans:dp[i];
}
ofs<<ans;
return 0;
}