华科软院复试2007-2017年上机题C++版本(下篇)

2023-12-05 10:08

本文主要是介绍华科软院复试2007-2017年上机题C++版本(下篇),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

PS:我也不懂为什么文章突然就变成VIP文章了,导致后面的内容看不了,需要完整版本的话,可以关注我的公众号
Alt
发送信息在后台,我看到就会回复~

写在前面的话:
2019年华中科技大学软件学院的复试已经尘埃落定,为了机试也刷了一下历年的软院上机题,虽然并没有用到(2019年软院专硕没有上机),为了造福学弟学妹们,把自己写的代码放出来,仅供参考。
注:使用的c/c++编写的,由于篇幅较长,分为上篇和下篇,上篇为2017年——2013年真题,下篇为2012年——2007年真题加我自己拓展的一些跟历年真题类似的题目,代码中都含题目描述,其中2018年跟2019年软院没有机试,文末也放了pdf的链接供下载
祝都能考上自己心仪的学校!

2012-1-平方回文数(与2013-1相同)

2012-2-约瑟夫环

#include <iostream>
#include <string>
using namespace std;
/*========================================
约瑟夫环
一群人(排列的编号从 1 到 N,N 可以设定)围成一圈,按一定规则出列。剩余的人仍
然围成一圈,出列规则是顺着 1 到 N 的方向对圈内的人从 1 到 C 记数(C 可以设定)。圈内
记数为 C 的人出列。剩余的人重新计数。按上述规则,让圈内所有的人出列。请编程输出
出列编号的序列。
例:
若 N=3,C=1,则出列编号的序列为 1,2,3
若 N=3,C=2,则出列编号的序列为 2,1,3
分析:
方法一:链表,麻烦,省略
方法二:循环数组,
循环条件为:index = (index + 1) % count
初始alive = count,每出圈一个,alive --,
循环结束条件为:alive > 0
每一次循环,就是过一个人,该人在圈内还是圈外,圈内number++,圈外number不变,
故定义一数组circle[count],记录该编号是已出圈还是未出圈,圈内为0,圈外为1
number = number + 1 - circle[index]malloc()只分配内存,calloc()除了分配内存外,还将分配的内存清空为0。
这两段代码等价
int* buffer = (int*)malloc(512 * sizeof(int));
memset(buffer, 0, 512 * sizeof(int));
int* buffer = (int*)calloc(512, sizeof(int));
by shinerise 2019/2/27
=============================================*/
void sequence(int count, int boom){int number = 0;//number为计数int alive = count;//alive表示是否全出圈int index = 0;//index为下标int *circle = (int*)calloc(count, sizeof(int));//创建数组,用于表示该元素是在圈内还是圈外,初始为0while(alive > 0){number = number + 1 - circle[index];if(number == boom){//出圈的操作cout<<index + 1<<" ";circle[index] = 1;//circle置为1表示在圈外number = 0;//重新计数alive --;}index = (index + 1)%count;}free(circle);
}
int main(){int n, c;//n为总人数,第c个出圈//cin空字符(包括回车,TAB,空格)都会当成一个输入的结束cin>>n>>c;sequence(n, c);return 0;
}

2011-1-已知二叉树前序中序序列,输出后序序列

/*==================================
已知一颗二叉树 S 的前序遍历和中序遍历序列,请编程输出二叉树 S 的后续遍历序
列。
例:
输入:
pred[]/先序:A、B、D、E、C、F、G
inod[]/中序:D、B、E、A、C、G、F
输出:
后序遍历序列是:D、E、B、G、F、C、A
by shinerise 2019/2/27
=======================================*/
#include <iostream>
#include <string>
using namespace std;
const int N = 50;
typedef char ElemType;
typedef struct BiTree{ElemType data;struct BiTree *lchild;struct BiTree *rchild;
}BiTree;//获取元素ch在数组array中的下标,数组array长度为len
int getIndex(ElemType ch, ElemType *array, int len){for(int i=0;i<len;i++){if(array[i] == ch){return i;}}
}//构造二叉树根节点,pre为先序数组,in为中序数组,len为数组长度
BiTree *createBiTree(ElemType *pre, ElemType *in, int len){if(len <= 0){return NULL;}BiTree *root = new BiTree;root->data = *pre;int index = getIndex(*pre, in, len);root->lchild = createBiTree(pre+1, in, index);root->rchild = createBiTree(pre+1+index, in+1+index, len-index-1);return root;
}//后序遍历序列
void postOrder(BiTree *root){if(root != NULL){postOrder(root->lchild);postOrder(root->rchild);cout<<root->data;}
}int main(){ElemType *pre = new ElemType[N];ElemType *in = new ElemType[N];cin>>pre;cin>>in;//strlen为数组长度BiTree *root = createBiTree(pre, in, strlen(in));postOrder(root);cout<<endl;return 0;
}

2011-2-循环数组输出下一个比这个元素更大的值

//循环数组输出下一个元素比这个元素更大的值
#include <iostream>
using namespace std;
int main(){int n;cin>>n;int *str = new int[n];for(int i=0;i<n;i++){cin>>str[i];}for(int i=0;i<n;i++){int j;for(j=(i+1)%n;str[j]<=str[i]&&j!=i;j=(j+1)%n);if(str[j]>str[i]){cout<<str[j]<<" ";}else{cout<<-1<<" ";}}return 0;
}

2010-1-下标为奇数的小写字母转化为大写字母(与2014-2相同)

2010-2-中国象棋马走日,只能向右

/*=========================================
在半个中国象棋棋盘(5*5)上,马在左上角(1,1)处,马走日字。
只能往右走,不能向左,可上可下。求从起点到(m, n)处有几种不同的走法
by shinerise 2019/2/28
==========================================*/
#include <iostream>
#include <string>
using namespace std;
const int ROW = 5;
const int COLUMN = 5;
int sum = 0;
int chess[ROW][COLUMN] = {0};
int xdir[4] = {-2, -1, 1, 2};
int ydir[4] = {1, 2, 2, 1};//访问函数,x,y为此时坐标,m,n为要到达的位置
void visit(int x, int y, int m, int n){if(x>=0&&x<COLUMN&&y>=0&&y<ROW&&chess[x][y]==0){if(x==m&&y==n){sum++;return;}chess[x][y] = 1;for(int i=0;i<4;i++)visit(x+xdir[i], y+ydir[i], m, n);chess[x][y] = 0;}
}int main(){int m, n;cin>>m>>n;//为方便,从下标为0开始visit(0, 0, m-1, n-1);cout<<"有"<<sum<<"种走法"<<endl;return 0;
}

2009-1-最长公共子串(与2017-1相同)

2009-2-已知二叉树前序中序遍历求后序遍历(与2011-1相同)

2008-1-斐波那契数列

#include <iostream>
#include <string>
using namespace std;
/*========================================
求数列 s(n)=s(n-1)+s(n-2)的第 n 项的值。其中 s(1)=s(2)=1。
输入:n,
输出:s(n)
by shinerise 2019/2/27
=======================================*/
int getNum(int n){if( n==1 || n==2 ){return 1;}else{return getNum(n-1)+getNum(n-2);}
}
int main(){int n;cin>>n;cout<<getNum(n);return 0;
}

2008-2-水仙花数

/*=====================================
打印出所有的“水仙花数”,所谓“水仙花数”是指一个 3 位数,其各位数字立方和等于
该数本身。
例:153=1*1*1+3*3*3+5*5*5
by shinerise 2019/2/27
======================================*/
#include <iostream>
#include <string>
using namespace std;
int main(){for(int i=100;i<1000;i++){int a, b, c;//a,b,c分别为i的个位,十位,百位a = i % 10;b = i / 10 % 10;c = i / 100;if(i==(a*a*a+b*b*b+c*c*c)){cout<<i<<endl;}}return 0;
}

拓展1-已知中序后序求前序遍历序列

/*==================================
已知一颗二叉树 S 的后序遍历和中序遍历序列,请编程输出二叉树 S 的先序遍历序列。
by shinerise 2019/2/27
=======================================*/
#include <iostream>
#include <string>
using namespace std;
typedef struct BiTree{char data;struct BiTree *lchild;struct BiTree *rchild;
}BiTree;
const int N = 50;//获取元素在中序数组中的下标,ch为元素,array为数组,len为数组长度
int getIndex(char ch, char *array, int len){for(int i=0;i<len;i++){if(array[i] == ch){return i;}}
}//构造二叉树,post为后序数组,in为中序数组,len为数组长度
BiTree *createBiTree(char *in, char *post, int len){if(len <= 0){return NULL;}BiTree *root = new BiTree;char ch = post[len-1];root->data = ch;int index = getIndex(ch, in, len);root->lchild = createBiTree(in, post, index);root->rchild = createBiTree(in+index+1, post+index, len-index-1);return root;
}//输出先序遍历序列
void preOrder(BiTree *root){if(root != NULL){cout<<root->data;preOrder(root->lchild);preOrder(root->rchild);}
}int main(){char *in = new char[N];char *post = new char[N];cin>>in;cin>>post;BiTree *root = createBiTree(in, post, strlen(in));preOrder(root);cout<<endl;return 0;
}

拓展2-子串在主串中匹配出现次数

//子串在主串中匹配,求子串出现的次数,不重复
#include <iostream>
using namespace std;
const int N = 255;
int main(){char *str = new char[N];char *substr = new char[N];cin>>str;cin>>substr;int a = 0, b = 0;int num = 0;//num记录次数while(a<strlen(str)&&b<strlen(substr)){if(str[a] == substr[b]){if(b == strlen(substr) - 1){num++;a++;b = 0;}else{a++;b++;}}else{a++;b = 0;}}cout<<num<<endl;return 0;
}

拓展3-数字串中奇数移到偶数的前面

//将数组中奇数移到偶数前面
#include <iostream>
#include <string>
using namespace std;
int main(){int n;cin>>n;int *str = new int[255];for(int i=0;i<n;i++){cin>>str[i];}int left = 0;int right = n - 1;int i = 0;int count = 0;while(count < n){if(str[i]%2==1){left++;count++;i++;}else{int temp = str[i];str[i] = str[right];str[right] = temp;count++;right--;}}for(int i=0;i<n;i++){cout<<str[i]<<" ";}cout<<endl;return 0;
}

拓展4-已知满二叉树前序序列,求后序序列

//已知满二叉树先序遍历序列,求后序遍历序列
#include <iostream>
using namespace std;void search(char *str, int len){if(len<=0){return;}else{int sublen = (len - 1)/2;search(str+1, sublen);search(str+1+sublen, sublen);cout<<*str;}
}
int main(){char *str = new char[50];cin>>str;search(str, strlen(str));return 0;
}

拓展5-比较两个字符串返回其字典序的大小

/*======================================
给定两个字符串,长度不超过100,字符串匹配,若相等,返回0,若不相等,返回ascii的差值
若str1>str2,差值为正,若str1<ste2,差值为负
by shine_rise 2019/3/9====================================*/
#include <iostream>
#include <string>
using namespace std;
int main(){string str1, str2;cin>>str1>>str2;int len1 = str1.length();int len2 = str2.length();int len = (len1<len2)?len1:len2;int i = 0;int index;while(i<len){if(str1[i]==str2[i]){i++;}else{index = str1[i] - str2[i];break;}}if(i==len){if(len1==len2){index = 0;}else if(len1>len2){index = str1[i];}else{index = -str2[i];}}cout<<"比较两个字符串的差值为"<<index<<endl;system("pause");return 0;
}

拓展6-大写字母转化为小写字母

/*=====================================
将全部字符串转换为小写字母,并将其中所有的连续子串转换为对应的缩写形式输出,
比如abcD 转换为a-d,其次,-至少代表1个字母,既如果是ab,则不需要转换为缩写形式。
by shinerise 2019/3/9========================================*/
#include <iostream>
#include <string>
using namespace std;
int main(){string str;cin>>str;int len = str.length();for(int i=0;i<len;i++){if(str[i]>='A'&&str[i]<='Z'){str[i] = str[i] + 'a' - 'A';}cout<<str[i];}cout<<endl;if(len==1||len==2){cout<<"缩写形式为"<<str<<endl;}else{cout<<"缩写形式为"<<str[0]<<"-"<<str[len-1]<<endl;}system("pause");return 0;
}

拓展7-字符串匹配

/*===============================
输入格式:匹配单词时,不区分大小写,但要求完全匹配,即给定单词必须与文章中的某一独立单词在不区分大小写的情况下完全相同,
如果给定单词仅是文章中某一单词的一部分则不算匹配
共2行。第1行为一个字符串,其中只含字母,表示给定单词,不区分大小写;第2行为一个字符串,其中只可能包含字母和空格,表示给定的文章。输出格式:
一行,如果在文章中找到给定单词则输出两个整数,两个整数之间用一个空格隔开,
分别是单词在文章中出现的次数和第一次出现的位置
(即在文章中第一次出现时,单词首字母在文章中的位置,位置从0开始);
如果单词在文章中没有出现,则直接输出一个整数-1
输入:
To
to be or not to be is a question
输出2 0
输入:
to
Did the Ottoman Empire lose its power at that time
输出:-1
by shinerise 2019/3/1==============================*/
#include <iostream>
#include <string>
using namespace std;
int main(){string str1, str2;getline(cin, str1);getline(cin, str2);for(int i=0;i<str1.length();i++){str1[i] = tolower(str1[i]);}for(int j=0;j<str2.length();j++){str2[j] = tolower(str2[j]);}str1 = ' ' + str1 + ' ';str2 = ' ' + str2 + ' ';if(str2.find(str1)==string::npos){cout<<-1<<endl;}else{int firstIndex = str2.find(str1);int index = str2.find(str1);int count = 0;while(index != string::npos){count++;index = str2.find(str1, index+1);}cout<<count<<" "<<firstIndex<<endl;}system("pause");return 0;
}

链接
华科软院复试2007-2017年上机题C++版本(上篇)

华科软院复试2007-2017年上机题C++版本pdf
https://pan.baidu.com/s/1xUc9702MNEwta1ga2zG80A
提取码:js8m

扫一扫下面的二维码,你将获得一个倾听者~

Alt

这篇关于华科软院复试2007-2017年上机题C++版本(下篇)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/457121

相关文章

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

06 C++Lambda表达式

lambda表达式的定义 没有显式模版形参的lambda表达式 [捕获] 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 有显式模版形参的lambda表达式 [捕获] <模版形参> 模版约束 前属性 (形参列表) 说明符 异常 后属性 尾随类型 约束 {函数体} 含义 捕获:包含零个或者多个捕获符的逗号分隔列表 模板形参:用于泛型lambda提供个模板形参的名

6.1.数据结构-c/c++堆详解下篇(堆排序,TopK问题)

上篇:6.1.数据结构-c/c++模拟实现堆上篇(向下,上调整算法,建堆,增删数据)-CSDN博客 本章重点 1.使用堆来完成堆排序 2.使用堆解决TopK问题 目录 一.堆排序 1.1 思路 1.2 代码 1.3 简单测试 二.TopK问题 2.1 思路(求最小): 2.2 C语言代码(手写堆) 2.3 C++代码(使用优先级队列 priority_queue)

【C++高阶】C++类型转换全攻略:深入理解并高效应用

📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C++ “ 登神长阶 ” 🤡往期回顾🤡:C++ 智能指针 🌹🌹期待您的关注 🌹🌹 ❀C++的类型转换 📒1. C语言中的类型转换📚2. C++强制类型转换⛰️static_cast🌞reinterpret_cast⭐const_cast🍁dynamic_cast 📜3. C++强制类型转换的原因📝

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

c++的初始化列表与const成员

初始化列表与const成员 const成员 使用const修饰的类、结构、联合的成员变量,在类对象创建完成前一定要初始化。 不能在构造函数中初始化const成员,因为执行构造函数时,类对象已经创建完成,只有类对象创建完成才能调用成员函数,构造函数虽然特殊但也是成员函数。 在定义const成员时进行初始化,该语法只有在C11语法标准下才支持。 初始化列表 在构造函数小括号后面,主要用于给