中科大2007年复试机试题

news2025/1/12 8:43:01

中科大2007年复试机试题

文章目录

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159663.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

博主的心肝宝贝

写的不错的文档 Sql(Structured Query Language)语句笔记_sky wide的博客-CSDN博客常用sql语句总结https://blog.csdn.net/qq_44652591/article/details/127545318Linux samba服务配置_sky wide的博客-CSDN博客_linux samba配置但是&#xff0c;注意后面公司的需求&#xff0c;…

Docker部署Jenkins

系列文章目录 Docker部署 registry Docker搭建 svn Docker部署 Harbor Docker 部署SQL Server 2017 Docker 安装 MS SqlServer Docker部署 Oracle12c Docker部署Jenkins Docker部署Jenkins系列文章目录前言一、启动docker&#xff0c;下载Jenkins镜像文件二、创建Jenkins挂载目…

fastjson 1.2.24漏洞复现

原理 fastjson由于没有对type进行安全性验证&#xff0c;使攻击者传入危险的类&#xff0c;通过rmi服务指定的攻击机上的恶意class文件&#xff0c;导致命令执行。 版本 1.2.24 环境准备 靶机&#xff1a;ubuntu&#xff0c;192.168.52.129 攻击机&#xff1a;kali&#…

数组的定义和使用

一、一维数组的定义、初始化 1. 一维数组的定义 元素类型 数组名[常量表达式]&#xff1b; &#xff08;1&#xff09;一维数组是由元素类型、数组名和长度组成的构造类型。 &#xff08;2&#xff09;数组名必须符合C标识符规则。 &#xff08;3&#xff09;常量表…

【ONE·C || 初识C语言 】

总言 C语言初步认识。 文章目录总言1、main函数的三种写法2、常见数据类型&#xff1a;内置类型、自定义类型2.1、内置类型总述2.2、内置类型大小计算(32/64)2.3、计算机基本存储单位3、常量、变量3.1、变量3.1.1、变量的分类&#xff1a;全局变量、局部变量3.1.2、变量的作用域…

XL1278-SMT无线模块介绍

XL1278-SMT无线模块简介XL1278-SMT无线模块是采用SEMTECH公司最新的LoRaTM调制技术的无线芯片&#xff0c;该模块除传统的GFSK调制技术外&#xff0c;还采用了LoRa&#xff08;远程&#xff09;扩频技术&#xff0c;具有超远距离扩频通讯&#xff0c;高抗干扰性和最大限度的减小…

SAP 成本组件分割价格详解

本文整理CKM3中“CV成本组件”视图下各项成本的价格取值逻辑。 SELECTTCKH3~ELEMT ”成本构成号TCKH3~EL_HV ”全部成本TCKH1~TXELE ”成本构成名称TKEVA04~WERTKOMP1 ”字段名FROM TCKH3INNER JOIN TCKH1 ON TCKH1~ELEHK TCKH3~ELEHKAND T…

JavaScript 比较 和 逻辑运算符

文章目录JavaScript 比较 和 逻辑运算符比较运算符如何使用逻辑运算符条件运算符JavaScript 比较 和 逻辑运算符 比较和逻辑运算符用于测试 true 或者 false。 比较运算符 比较运算符在逻辑语句中使用&#xff0c;以测定变量或值是否相等。 x5&#xff0c;下面的表格解释了比较…

笔记本电脑连接不上wifi怎么办?看下面4种方法

WIFI可以让我们的网络运行得更快&#xff0c;尤其是对于工作来说&#xff0c;它是不可或缺的。但是有时候&#xff0c;我们明明在笔记本电脑上看到WIFI&#xff0c;但就是连接不上&#xff0c;笔记本电脑连接不上wifi怎么办&#xff1f;方法主要有下面4个&#xff01; 演示机型…

剖析valueOf方法,深入探究Integer缓存实现机制

一. 问题展现我们在面试的时候&#xff0c;面试官经常会给面试者洒出一些迷雾&#xff0c;用来迷惑面试者&#xff0c;这时往往就需要面试者掌握底层源码&#xff0c;才能对问题进行较好的回答。接下来壹哥就以Integer的缓存数组为例&#xff0c;通过分析其源码来教会大家该如何…

Linux串口测试例程

嵌入式Linux开发过程中&#xff0c;进行Linux串口测试&#xff0c;需要针对串口进行回环测试或者指定串口接收一定的数据或者指定串口发送一定的数据使用该测试用例很快验证硬件串口的稳定性和正确性。使用代码连接如下Linux串口测试例程&#xff0c;进行Linux串口测试&#xf…

爬虫逆向之字体反爬(二)、镀金的天空-字体反爬-2

趁热打铁来写字体反爬的第二篇&#xff0c;首先是题目 网页上显示的不是常规的数字&#xff0c;源码里面也是一些汉字 虽然看上去很乱&#xff0c;但是仔细观察还是能发现一些规律&#xff0c;比如&#xff1a;长 对应 2&#xff0c;思对应 1 所以这里的解题思路&#xff0c;也…

基于Python实现四大名著章节标注汉语拼音

起因很单纯&#xff0c;就是给我1年级小豆包的女儿标注三国和西游章节的汉语拼音&#xff0c;我女儿每天都朗读 &#xff0c;结果有很多字不认识&#xff0c;我爱人居然让我给标记不认识的完了手动注音......我勒个去......身为程序员的我怎么能忘记用程序实现呢&#xff0c;特…

再次战胜人类:Meta AI推出首款可以忽悠人的AI模型

文&#xff5c;ShonaCicero&#xff0c;是Meta AI提出的能够在『强权外交』游戏中超越人类的AI模型。它凭借自己"忽悠"人的能力&#xff08;模拟谈判与合作&#xff09;&#xff0c;成为游戏里的顶级高手。AI模型连外交这活儿都能得心应手了&#xff1f;没错&#xf…

【尚硅谷】Java数据结构与算法笔记07 - 排序算法

文章目录一、排序算法简介二、排序的分类三、冒泡排序3.1 基本介绍3.2 算法图解3.3 代码实现四、选择排序4.1 基本介绍4.2 思路分析4.3 算法图解4.4 代码实现五、插入排序5.1 基本介绍5.2 思路分析5.3 算法图解5.4 代码实现六、希尔排序6.1 简单插入排序存在的问题6.2 基本介绍…

知识点查漏补缺

目录谷粒商城知识点补充前言1 java8新特性之lambda表达式1.1 为什么使用1.2 从匿名类到Lambda的转换1.3 语法总结2 Stream API2.1 概述2.2 创建2.2.1 通过集合2.2.2 通过数组2.2.3 通过Stream的of()2.2.4 创建无限流2.3 中间操作2.3.1 筛选与切片1)、filter2)、limit3)、skip(n…

【数据结构】—— Java实现队列和循环队列

队列与循环队列一、队列1.概念2.队列的使用3.队列的模拟实现二、循环队列1.基本概念2.代码实现一、队列 1.概念 队列&#xff1a;是允许在一端进行插入操作&#xff0c;而在另一端进行删除操作的线性表。 队列是一种先进先出的&#xff08;First In First Out&#xff09;的…

商场楼层分布图用什么软件做,高效、便捷的商场二三维地图绘制平台

现在的很多大型购物商场占地面积较大&#xff0c;商品种类繁多&#xff0c;如果没有商场导航&#xff0c;会导致新顾客难以找到想要的店铺和商品&#xff0c;那么大型购物商场导航怎么实现呢&#xff1f;电子地图作为大家最喜闻乐见的高效应用形式&#xff0c;在商业应用中&…

C生万物 | 函数的讲解与剖析【内附众多案例详解】

&#x1f451;作者主页&#xff1a;Fire_Cloud_1 &#x1f3e0;学习社区&#xff1a;烈火神盾 &#x1f517;专栏链接&#xff1a;万物之源——C 一起来学习函数吧&#xff01;一、函数是什么&#xff1f;二、C语言中函数的分类1、库函数2、自定义函数【⭐⭐⭐】三、函数的参数…

【Linux学习】vim指令集(一)

Linux的最高境界 1、背景 vim是一款多模式的文本编辑器&#xff0c;兼容所有的vi语法&#xff0c;其有多种操作模式&#xff0c;每种模式可以互相切换。vim的安装指令如下所示&#xff1a; yum install -y vim2、vim编辑器的相关指令 常用的vim模式有命令模式、插入模式、底…