草庐IT

中科大2007年复试机试题

落幕·重逢 2024-03-20 原文

中科大2007年复试机试题

文章目录

第一题

问题描述

编写程序,判断给定数字是否是回文数。
示例 1

输入:12
输出:Y

示例 2

输入:234
输出:N

解题思路及代码

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

#include<iostream>
using namespace std;
int main()
{
    string s;
    while(cin>>s)
    {
        int i = 0;
        int j = s.size()-1;
        while(i < j)
        {
            if(s[i] != s[j])
            {
                cout<<"N"<<endl;
                break;
            }
            i++;
            j--;
        }
        if(j == i)
        {
            cout<<"Y"<<endl;
        }
    }
    return 0;
}

第二题

问题描述

队列的循环报数问题:设有n个人站成一排,从左往右的编号分别为1~n,现在从左往右报数“1,2,1,2…”,数到“1”的人出列,数到“2”的人立即站到队伍的最右端。报数过程反复进行,直到n个人都出列为止。要求给出它们的出列顺序。
n从键盘输入,出列顺序输出到控制台。
示例 1

输入:10
输出:1 3 5 7 9 2 6 10 8 4

解题思路及代码

由题意得该问题涉及队列,对于队列的奇偶位置上的数有不同的处理方法。

奇数位置:直接弹出
偶数位置:先弹出再入队

重复上述操作直至队列为空。

#include <iostream>
#include<queue>
using namespace std;
int main()
{
    int n;
    cin>>n;
    queue<int>q;
    for(int i = 0; i < n; i++)
    {
        q.push(i+1);
    }
    int flag = 1;
    while(!q.empty())
    {
      if(flag == 1)
      {
          cout<<q.front()<<" ";
          q.pop();
          flag = 0;
      }
      else
      {
          int tmp = q.front();
          q.pop();
          q.push(tmp);
          flag = 1;
      }
    }

    return 0;
}

第三题

问题描述

无向图的最小生成树:输入在文件3.in中给出,描述了图的形状。首先给出图中结点的总数n,结点编号从0到n-1,然后接下来每一行给出边的信息,每行包含三个数字,分别是两个顶点的编号以及边长。要求出无向图对应的最小生成树,将结果输出到文件3.out中。

示例 1

输入:
9
7      6    1 
8      2    2 
6      5    2 
0      1    4 
2      5    4 
8      6    6 
2      3    7 
7      8    7 
0      7    8 
1      2    8 
3      4    9 
5      4    10
1      7    11
3      5    14
输出:
7 -- 6 : 1
6 -- 5 : 2
8 -- 2 : 2
2 -- 5 : 4
0 -- 1 : 4
2 -- 3 : 7
1 -- 2 : 8
3 -- 4 : 9

解题思路及代码

求无向图的最小生成树常用的算法是prim算法和kruskal算法,针对本题选择kruskal算法比较合适,而且相比prim算法,kruskal算法思路实现更简单,复杂度一般也低。
krus算法的实现过程:每次从无向图中选取边长最小的边加入最小生成树中,加入时要注意不能与已经加入的顶点构成连通,构成连通则需放弃加入该边,如果无向图的顶点数为n,那么选择n-1条符合条件的边即停止。
判断边是否连通的方法:用subset[n]数组来表示每个边所在的子集序号,设新加入的两个顶点的subset为i、j,出现的情况为

i == 0 && j == 0,说明两个顶点不在其他子集中,加入新的子集 
i == j && i != 0,两个顶点存在于相同的子集中,加入的边会导致连通,应该舍弃
i != j && i != 0 && j != 0,两个顶点存在与不同的子集中,合并两个不同的子集
((i != 0 && j == 0) || (i == 0 && j != 0)),将不在任何子集中的顶点加入另一个顶点的子集
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
using namespace std;
struct Edge
{
    int beg, eds, weight;
    Edge(int beg,int eds, int weight):beg(beg), eds(eds), weight(weight) {}
};
struct cmp //使得队列从小到大排序
{
    bool operator()(const Edge &l, const Edge &r)
    {
        return l.weight > r.weight;
    }
};
int main()
{
    ifstream ifs("./3.in.txt");
    ofstream ofs("./3.out.txt");
    int n;
    ifs>>n;
    vector<int>subset(n,0);
    priority_queue<Edge,vector<Edge>,cmp> edges;
    vector<Edge> ans;
    int a,b,c;
    int maxid = 1;
    while(ifs>> a >> b >> c)
    {
        edges.push(Edge(a,b,c));
    }
    while(!edges.empty() && ans.size() < n-1)
    {
        Edge e = edges.top();
        edges.pop();
        int i = subset[e.beg], j = subset[e.eds];
        if(i == 0 && j == 0)
        {
            subset[e.beg] = subset[e.eds] = maxid++;
            ans.push_back(e);
        }
        else if(i != j && i != 0 && j != 0)
        {
            for(int k = 0; k < subset.size();k++)
            {
                if(subset[k] == i)
                    subset[k] = j;
            }
            ans.push_back(e);
        }
        else if(i != 0 && j == 0)
        {
            subset[e.eds] = subset[e.beg];
            ans.push_back(e);
        }
        else if(i == 0 && j != 0)
        {
            subset[e.beg] = subset[e.eds];
            ans.push_back(e);
        }
    }
    for (auto &e : ans)
    {
        ofs<<e.beg<<"--"<<e.eds<<" :"<<e.weight<<endl;
    }
    return 0;
}

第四题

问题描述

中序后序得前序:输入在文件4.in中给出,首先给出二叉树中的顶点个数 n,然后在接下来两行给出中序和后序序列,要求根据中序和后序序列构建二叉树,并且将二叉树的前序遍历序列输出到文件4.out中。
示例1

输入:
5
D B A C E
D B E C A
输出: A B D C E

解题思路及代码

前序:根-左-右
中序:左-根-右
后序:左-右-根

根据这个特点可知后序的最后一个元素表示是根节点,而在中序中根节点的左边为左子树,右边为右子树,故可根据这个特点将其分为两个子树然后不断循环从而构造该二叉树,之后再前序遍历该二叉树。
设后序遍历的根节点在中序遍历的位置为i,in数组的范围为[l1,r1],out数组的范围为[l2,r2]

左子树:在in数组的位置: l1 ~ i-1             在post数组的位置: l2 ~ l2+i-1-l1
右子树:在in数组的位置: i+1 ~ r1             在post数组的位置: l2+i-l1 ~ r2-1

该题与Leetcode上的题目类似。

#include<iostream>
#include<fstream>
#include<vector>
using namespace std;
struct TreeNode
{
    char val;
    TreeNode *lchild, *rchild;
    TreeNode(char val):val(val){}
};
TreeNode *make(vector<char> in, vector<char> post,int l1,int r1,int  l2,int r2)
{
    if(l1 > r1) return NULL;
    TreeNode *t = new TreeNode(post[r2]);
    int i;
    for(i = l1; i <= r1; i++)
    {
        if(in[i] == post[r2])
        {
            break;
        }
    }
    t->lchild = make(in,post,l1,i-1,l2,l2+i-1-l1);
    t->rchild = make(in,post,i+1,r1,l2+i-l1,r2-1);
    return t;

}
TreeNode *buildTree(vector<char> in, vector<char> post)
{

    TreeNode *root = make(in,post,0,in.size()-1,0,post.size()-1);
    return root;

}
void inOrder(TreeNode *root,ofstream &ofs)
{
    if(root != NULL)
    {
        ofs<<root->val<<" ";
        inOrder(root->lchild,ofs);
        inOrder(root->rchild,ofs);
    }
    else
    {
        return;
    }
}
int main()
{
    ifstream ifs("./4.in.txt");
    ofstream ofs("./4.out.txt");
    int n;
    ifs>>n;
    vector<char>in(n),post(n);
    for(int i = 0; i < n; i++)
    {
        ifs >> in[i];
    }
    for(int i = 0; i < n; i++)
    {
        ifs >> post[i];
    }
    TreeNode *root = buildTree(in,post);
    inOrder(root,ofs);
    return 0;
}

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

有关中科大2007年复试机试题的更多相关文章

  1. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  2. 蓝桥杯C/C++VIP试题每日一练之报时助手 - 2

    ?作者主页:静Yu?简介:CSDN全栈优质创作者、华为云享专家、阿里云社区博客专家,前端知识交流社区创建者?社区地址:前端知识交流社区?博主的个人博客:静Yu的个人博客?博主的个人笔记本:前端面试题个人笔记本只记录前端领域的面试题目,项目总结,面试技巧等等。接下来会更新蓝桥杯官方系统基础练习的VIP试题,依然包括解题思路,源代码等等。问题描述:给定当前的时间,请用英文的读法将它读出来。时间用时h和分m表示,在英文的读法中,读一个时间的方法是:  如果m为0,则将时读出来,然后加上“o’clock”,如3:00读作“threeo’clock”。  如果m不为0,则将时读出来,然后将分读出来,如5

  3. 华为OD机试 -旋转骰子(Python) | 机试题算法思路 【2023】 - 2

    最近更新的博客华为OD机试-卡片组成的最大数字(Python)|机试题算法思路华为OD机试-网上商城优惠活动(一)(Python)|机试题算法思路华为OD机试-统计匹配的二元组个数(Python)|机试题算法思路华为OD机试-找到它(Python)|机试题算法思路华为OD机试-九宫格按键输入(Python)|机试算法备考思路华为OD机试-身高排序(Python)|备考思路使用说明参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。华为OD清单查看地址:blog.csdn.net/hihell/catego

  4. 网络安全岗位面试题 - 2

    前言介绍了网络安全岗位常见的面试题,仅供参考!一、常识部分1.Linux服务器种用户关键信息存储在那个文件中?启动、停止、重启、开机自启mysql服务命令?如何查找/etc/test.txt文件中"password"关键字信息?如何精确查找80端口?/etc/passwdsystemctlstartmysqld或systemmysqldstart 启动systemctlstopmysqld或systemmysqldstop 停止systemctlrestartmysqld或systemmysqldrestart 重启systemctlenablemysqld或systemmysqldenabl

  5. 科大讯飞刘聪:由ChatGPT浪潮引发的深入思考与落地展望 - 2

    近期,以“生成式人工智能”(GenerativeAI)为核心技术的聊天机器人ChatGPT火爆全球。百度、阿里巴巴、科大讯飞、360等国内企业纷纷抛出ChatGPT相关进展,打造中国版的ChatGPT。科大讯飞此前在投资者互动平台表示,ChatGPT主要涉及到自然语言处理相关技术,属于认知智能领域的应用之一,公司在该方向技术和应用具备长期深厚的积累。并称2022年12月已进一步启动生成式预训练大模型任务攻关,类ChatGPT技术将在今年5月率先落地科大讯飞AI学习机产品。近日,科大讯飞副总裁、研究院执行院长刘聪围绕什么是ChatGPT,它强在哪里?会对未来世界带来哪些颠覆性影响?进一步阐述Ch

  6. ruby 面试题 - 2

    我在之前的面试中遇到了这个问题,但做不到,知道吗?这是做什么的:`$=`;$_=\%!;($_)=/(.)/;$==++$|;($.,$/,$,,$\,$",$;,$^,$#,$~,$*,$:,@%)=($!=~/(.)(.).(.)(.)(.)(.)..(.)(.)(.)..(.)......(.)/,$"),$=++;$.++;$.++;$_++;$_++;($_,$\,$,)=($~.$"."$;$/$%[$?]$_$\$,$:$%[$?]",$"&$~,$#,);$,++;$,++;$^|=$";`$_$\$,$/$:$;$~$*$%[$?]$.$~$*${#}$%[$?]$;

  7. 华为OD机试题 Q2 押题【贪心的商人 or 最大利润】用 C++ 编码,速通 - 2

    最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理已参加机试人员的实战技巧本篇题解:贪心的商人or最大利润题目描述商人经营一家店铺,有number种商品,由于仓库限制每件商品的最大持有数量是item[index],每种商品的价格在每天是item_price[item_index][day],通过对商品的买进和卖出获取利润,请给出商人在days天内能获取到的最大的利润;注:同一件商品可以反复买进和卖出;输入描述3//输入商品的数量nu

  8. 网络安全必备1000道面试题集锦(附答案) - 2

    前言以下为网络安全各个方向涉及的面试题,星数越多代表问题出现的几率越大,祝各位都能找到满意的工作。注:本套面试题,已整理成pdf文档,但内容还在持续更新中,因为无论如何都不可能覆盖所有的面试问题,更多的还是希望由点达面,查漏补缺。一、渗透测试方向:如何绕过CDN找到真实IP,请列举五种方法(★★★)redis未授权访问如何利用,利用的前提条件是?(★★★)mysql提权方式有哪些?利用条件是什么?(★)windows+mysql,存在sql注入,但是机器无外网权限,可以利用吗?(★)常用的信息收集手段有哪些,除去路径扫描,子域名爆破等常见手段,有什么猥琐的方法收集企业信息?(★★)SRC挖掘与

  9. 【JavaScript】手撕前端面试题:对象参数浅拷贝 | 简易深拷贝 | 完整深拷贝 - 2

    🖥️NodeJS专栏:Node.js从入门到精通🖥️博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述)🖥️TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结)🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬👉你的一键三连是我更新的最大动力❤️!文章目录1、浅拷贝要求思路代码2、简易深拷贝要求思路代码3、完整深拷贝要求思路代码1、浅拷贝要求补全JavaScript代码,要求实现一个对象参数的浅拷贝并返回拷贝之后的新对象。注意:参数可能包含函数、正则、日期、ES6新对象是对对象的参数进行浅拷贝,并不是直接对整个对象进行浅拷贝(整个

  10. 【测试面经】软件测试面试题大全,软件测试必问必背面试题,敢说会70%就可以轻松拿offer...... - 2

    目录:导读前言一、测试面试基础题二、测试实战面试题三、测试基础知识点四、总结前言大部分人学软件测试的从业者,在找工作的同时,会因为软件测试面试题挡在门前。……跳槽最重要的一步自然是面试,正值跳槽季,网上出现了各种面试题,一时会让人眼花缭乱,分不清最该看哪个,所以为大家做了一些软件测试面试的真题,想跳槽的小伙伴们,请准备好你的小本本!一、测试面试基础题1、简述测试流程?2、什么是软件测试?软件测试的目的与原则?3、软件生存周期及其模型是什么?4、什么是软件质量?5、自动化测试脚本开发的主要步骤?6、目前主要的测试用例设计方法是什么?7、常见的测试用例设计方法都有哪些?请分别以具体的例子来说明这些

随机推荐