C/C++后端学习与练习深入

目录
  • 一、算法训练
    • 1.拓扑顺序
    • 2.功夫传人
    • 3.二叉树中的最低公共祖先
  • 二、工程项目训练
    • day1.Qt(串口的使用)
  • 三、总结

一、算法训练

首先给大家带来校招程序员考察的核心技能训练:算法,不管你用什么语言,

数据结构与算法一定是最核心的基本功。说得实际和功利一点, 算法是你进入大厂的敲门砖,还能帮你在工作中快速地弯道超车, 所以一定得搞懂哦~~~ 另外现在现在大厂的笔试很多采用ACM模式,面试手撕代码则多为力扣模式 (核心代码模式)今天给大家带来中大厂笔试训练

1.拓扑顺序

这是 2018 年研究生入学考试中给出的一个问题:

以下哪个选项不是从给定的有向图中获得的拓扑序列?

现在,请你编写一个程序来测试每个选项。
输入格式
第一行包含两个整数 N 和 M,分别表示有向图的点和边的数量。

接下来 M 行,每行给出一条边的起点和终点。

点的编号从 1 到 N。

再一行包含一个整数 K,表示询问次数。

接下来 K 行,每行包含一个所有点的排列。

一行中的数字用空格隔开。

输出格式
在一行中输出所有不是拓扑序列的询问序列的编号。

询问序列编号从 0 开始。

行首和行尾不得有多余空格,保证存在至少一个解。

数据范围
1≤N≤1000,
1≤M≤10000,
1≤K≤100
输入样例:
6 8
1 2
1 3
5 2
5 4
2 3
2 6
3 4
6 4
5
1 5 2 3 6 4
5 1 2 6 3 4
5 1 2 3 6 4
5 2 1 6 3 4
1 2 3 4 5 6
输出样例:
3 4

解析:首先了解一下拓扑排序的定义:在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:

1.每个顶点出现且只出现一次。

2.若存在一条从顶点 A 到顶点 B 的路径,那么在序列中顶点 A 出现在顶点 B 的前面。

有向无环图(DAG)才有拓扑排序,非DAG图没有拓扑排序一说。

//这题根据条件性质解题即可
#include<bits/stdc++.h>
using namespace std;
const int N=10050;
int nodes[N],a[N],b[N],p[N];
int n,m;
int main()
{
	cin>>n>>m;
	int i,j;
    for(i=0;i<m;i++)
	{
		cin>>a[i]>>b[i];
	}
	int k;
	cin>>k;
	bool flag;
	vector<int> v;
	for(i=0;i<k;i++)
	{
		 flag=1;
		 for(j=1;j<=n;j++)
		 {
		 	cin>>nodes[j];
		 	p[nodes[j]]=j;
		 }
		 for(j=0;j<m;j++)
		{
			if(p[a[j]]>p[b[j]])
			flag=0;
		}
		if(!flag)
		v.push_back(i);
	}
	for(i=0;i<v.size();i++)
	{
		if(i==0) cout<<v[i];
		else cout<<" "<<v[i];
	}
    cout<<endl;
}

2.功夫传人

//这题用邻接表存储一下信息,然后再dfs配合回溯即可
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+50;
vector<int> v[N];
int n,st[N];
double z,r,sum;
void dfs(int u,double p)
{
	if(st[u])
	{
		sum+=p*v[u][0];
		return;
	}
	for(int i=0;i<v[u].size();i++)
	dfs(v[u][i],p*(1-r/100));
}
int main()
{
    cin>>n>>z>>r;
    int i,x;
    for(i=0;i<n;i++)
    {
      int k;
      cin>>k;
      if(k==0)
      {
      	 st[i]=1;
      	 cin>>x;
         v[i].push_back(x);
	  }
      else
     {
      while(k--)
      {
        cin>>x;
        v[i].push_back(x);
	  }
      }
    }
    dfs(0,z);
    cout<<(int)sum;
}

3.二叉树中的最低公共祖先

树中两个结点 U 和 V 的最低公共祖先(LCA)是指同时具有 U 和 V 作为后代的最深结点。

给定二叉树中的任何两个结点,请你找到它们的 LCA。

输入格式
第一行包含两个整数 M 和 N,分别表示询问结点对数以及二叉树中的结点数量。

接下来两行,每行包含 N 个不同的整数,分别表示二叉树的中序和前序遍历。

保证二叉树可由给定遍历序列唯一确定。

接下来 M 行,每行包含两个整数 U 和 V,表示一组询问。

所有结点权值均在 int 范围内。

输出格式
对于每对给定的 U 和 V,输出一行结果。

如果 U 和 V 的 LCA 是 A,且 A 不是 U 或 V,则输出 LCA of U and V is A.

如果 U 和 V 的 LCA 是 A,且 A 是 U 或 V 中的一个,则输出 X is an ancestor of Y.其中 X 表示 A,Y 表示另一个结点。

如果 U 或 V 没有在二叉树中找到,则输出 ERROR: U is not found. 或 ERROR: V is not found. 或 ERROR: U and V are not found.

数据范围
1≤M≤1000,
1≤N≤10000
输入样例:
6 8
7 2 3 4 6 5 1 8
5 3 7 2 6 4 8 1
2 6
8 1
7 9
12 -3
0 8
99 99
输出样例:
LCA of 2 and 6 is 3.
8 is an ancestor of 1.
ERROR: 9 is not found.
ERROR: 12 and -3 are not found.
ERROR: 0 is not found.
ERROR: 99 and 99 are not found.

//常规方法建树再按题目要求做即可
#include<bits/stdc++.h>
using  namespace std;
const int N=1e4+50;
int m,n;
int in[N],pre[N],depth[N],p[N];
int build(int il,int ir,int pl,int pr,int d)
{
	int root=pre[pl];
	int k=root;
	depth[root]=d;
	if(il<k) p[build(il,k-1,pl+1,pl+1+(k-1-il),d+1)]=root;
	if(k<ir) p[build(k+1,ir,pl+1+(k-1-il)+1,pr,d+1)]=root;
	return root;
}
unordered_map<int,int> pos;
int main()
{
	cin>>m>>n;
	int i;
	for(i=0;i<n;i++)
   {
   	  cin>>in[i];
   	  pos[in[i]]=i;
   }
   for(i=0;i<n;i++)
   {
   	  cin>>pre[i];
   	  pre[i]=pos[pre[i]];
   }
   int a,b,x,y;
   build(0,n-1,0,n-1,0);
   while(m--)
   {
     	cin>>a>>b;
	    x=a,y=b;
	    if(pos.count(a)&&pos.count(b))
	    {
	    	a=pos[a],b=pos[b];
	    	x=a,y=b;
	          while(a!=b)
	    	{
	    		if(depth[a]>depth[b])
	    		a=p[a];
	    		else
	    		b=p[b];
			}
			if(a!=x&&a!=y)
			printf("LCA of %d and %d is %d.\n",in[x],in[y],in[a]);
			else if(a==x)
			printf("%d is an ancestor of %d.\n",in[x],in[y]);
			else
			printf("%d is an ancestor of %d.\n",in[y],in[x]);
		}
		else if(pos.count(a)==0&&pos.count(b)==0)
		printf("ERROR: %d and %d are not found.\n",x,y);
		else if(pos.count(a)==0)
		printf("ERROR: %d is not found.\n",x);
		else
		printf("ERROR: %d is not found.\n",y);
   }
}

二、工程项目训练

项目&实习对于秋招来说意义重大,一份好的实习可以让招聘方看到你的工作能力:

Tips:工作能力:工作能力指的是你工作相关的能力,是在目标岗位上的专业能力,通过实习可以积累你的实战经验,也可以向公司表明你在实际工作中的实操能力。

但是没有实习也并不代表你秋招无法找到一份好的工作:

你可以将在校期间的社团、竞赛等相关在校经历补充在简历上;另外如果掌握某种和工作相关的知识或技能,也要尽可能写得详细一些,一定要表明你是如何把上述这些知识技能运用于工作中的。这样可以表现出你很善于学习新知识的特点,给自己加印象分。另外要勤做项目,使自己的项目经历与自己求职的目标岗位相契合,当我们能在简历中通过自己过往的经历证明自己的能力优势,并且这个能力优势又是企业需要的,那么我们拿到面试机会的可能性就会很大。

下面由小学徒给大家带来Qt的项目学习秘籍,希望大家喜欢。

day1.Qt(串口的使用)

这里必须夸下Qt Creator的帮助(不同于其他IDE帮助需要联网)

学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口(api),图形接口的接口可以用海量来形容,但我们只需要记住常用的几个即可,君子性非异也,善假于物也。

大家要善于借助外物的力量,遇到不熟悉的直接去帮助文挡查看用法。

我们在日常使用中使用 Qt 帮助文档,有几个需要关注的点:

1)类使用的相关介绍

2)查看部件的信号

3)查看部件的事件(其所对应的虚函数如何编写)

4)查看所用部件(类)的相应成员函数(功能,参数,返回值)

1)类使用的相关介绍

Qt另一个方便之处在于光标移动到类名字的地方,接着按“F1”即可跳转到所对应的帮助文件:

可将光标移到类名字这里,然后按F1即可跳转到所对应的帮助文档。

2)查看部件的信号

以QplainTextEdit(纯文本输入框)为例我们来看到它的公有函数 

公有函数:共有成员可以被程序中的任何代码访问等等

Summary:Qt上手还是非常的容易,自带的帮助文档中的内容非常详细,还有示例代码,如果想着重学习UI的话:Qt Designer能让你通过以拖动控件放置的方式,可视化的设计UI界面,当你设计好界面编译完成后,在构建目录中会找到文件名形如“ui_XXXX.h”的头文件,这是Qt根据你的UI,自动帮你生成的C++代码,内容就是UI的C++实现方式,大家可以跟着它自动生成的这段代码学来学习UI是怎么实现的,这个比自己看文档要来的直观很多。而且对于初学者来说一个可拖拽位置可改变尺寸的有趣窗口要比一个黑框控制台程序要有意思的多。

三、总结

到此这篇关于C/C++后端学习与练习深入的文章就介绍到这了,更多相关C++后端内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C++算法学习之贪心算法的应用

    目录 贪心1 实验题目:减肥的小K1 实验题目:最小跳数 实验题目:排队接水 贪心-堂练 实验题目: 区间问题1 实验题目:种树 实验题目:智力大冲 实验题目:删除数字II 贪心1 实验题目:减肥的小K1 题目描述: 小K没事干,他要搬砖头,为了达到较好的减肥效果,教练规定的方式很特别:每一次,小K可以把两堆砖头合并到一起,消耗的体力等于两堆砖头的重量之和.经过 n-1次合并后, 就只剩下一堆了.小K在搬砖头时总共消耗的体力等于每次合并所耗体力之和.小K为了偷懒,希望耗费的体力最小.例如有 3堆

  • C++算法学习之回溯法的应用

    目录 回溯1 实验题目:n皇后 实验题目:符号三角形 回溯 堂练 实验题目:森林迷宫 实验题目:地图着色 回溯1 实验题目:n皇后 题目描述: N皇后的排列,每行一个不冲突:N<=13. 输入要求: 一个数字N (6 <= N <= 13) 表示棋盘是N x N大小的 输出要求: 前三行为前三个解,每个解的两个数字之间用一个空格隔开.第四行只有一个数字,表示解的总数. 解的输出顺序为从上到下从左到右,小的优先输出 实验代码及注释: #include<bits/stdc++.h>

  • C语言算法练习之抓交通肇事犯

    1. 问题描述 一辆卡车违反交通规则,撞人后逃跑.现场有三人目击该事件,但都没有记住车号,只记下车号的一些特征. 甲说:牌照的前两位数字是相同的: 乙说:牌照的后两位数字是相同的,但与前两位不同: 丙是数学家,他说:四位的车号刚好是一个整数的平方. 请根据以上线索求出车号. 2. 题目分析 按照题目的要求造出一个前两位数相同.后两位数相同且相互间又不同的 4 位整数,然后判断该整数是否是另一个整数的平方. 即求一个四位数 a 1.a 2 .a 3. a 4,满足如下的条件: 3. 算法设计 该题

  • C++学习之多态的使用详解

    目录 前言 多态 向上转型 向下转型 作用域 前言 最近为了完成数据库系统的实验,又复习起了<C++ Primer>,上一次看这本巨著也是大二下的六月份,那时看面向对象程序编程这一章还云里雾里的,没有领会多态的奥妙,学完 Java 之后回头再看这一章发现对多态有了更好的理解.好记性不如烂笔头,本篇博客将会对 C++ 的多态机制做一个不太详细的总结,希望下一次不需要从头再看一遍<C++ Primer>了 _(:з」∠)_. 多态 多态离不开继承,首先来定义一个基类 Animal,里面

  • JAVA后端学习精华之网络通信项目进阶

    目录 一.网络通信解决的问题 二.计算机网络的概念 三.IP 四.域名 五.端口 六.利用telnet完成简单的网络通信 Java网络通信项目进阶 一.网络通信解决的问题 不同机器,不同程序之间的数据交换 二.计算机网络的概念 计算机网课是指将地理位置不同的具有独立功能的多台计算机及外部设备通过通信线路连接起来,在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 三.IP ip地址:InetAddress 通过ip地址可以唯一定位一台网络上的计算机 1

  • Java后端学习精华之TCP通信传输协议详解

    目录 Socket连接模型 消息协议 传输过程中数据类型需要了解的细节 TCP通信代码 上篇教程回顾 ServerSocket --监听客户端的连接,他的作用主要是建立一个连接 -ServerSocket -建立连接,拿到一个Socket -Telnet 127.0.0.1 8888- 客户端使用Telnet访问服务端 建立连接 -服务端可以拿到一个Socket的对象 -获取这个对象的输入输出流 -写入和读取数据 Socket连接模型 服务端和客户端通过Socket进行连接,虽然是一个Socke

  • C/C++后端学习与练习深入

    目录 一.算法训练 1.拓扑顺序 2.功夫传人 3.二叉树中的最低公共祖先 二.工程项目训练 day1.Qt(串口的使用) 三.总结 一.算法训练 首先给大家带来校招程序员考察的核心技能训练:算法,不管你用什么语言, 数据结构与算法一定是最核心的基本功.说得实际和功利一点, 算法是你进入大厂的敲门砖,还能帮你在工作中快速地弯道超车, 所以一定得搞懂哦~~~ 另外现在现在大厂的笔试很多采用ACM模式,面试手撕代码则多为力扣模式 (核心代码模式)今天给大家带来中大厂笔试训练 1.拓扑顺序 这是 20

  • VUE前后端学习tab写法实例

    动态创建一个tab,里面放一个table,这样一个后台管理的基本功能(之一)就出来了. 好吧,这里其实只是试试水,感受一下vue的数据驱动可以怎么玩,通过一个个实例学习一下vue的各个知识点.这里要看看方法和css如何设置. 一.目标 1.  可以动态创建tab. 2.  可以切换(废话).可以关闭tab. 3.  Css的设置. 4.  方法的处理方式. 5.  效果图 二.思路 应该有好多种方式可以实现,这里先试一个,其他的以后再说. 还是数据驱动,那么就建立一个大的数据包,把tab信息和t

  • django项目中使用云片网发送短信验证码的实现

    1. 在apps包下新建一个utils的python包 2. utils包中新建一个YunPian.py文件,文件中代码如下 import requests import json def send_single_sms(apikey, code, mobile): # 发送单条短信 url = "https://sms.yunpian.com/v2/sms/single_send.json" text = "[后端学习]您的验证码是{}.如非本人操作,请忽略本短信"

  • Bootstrap table学习笔记(2) 前后端分页模糊查询

    在使用过程中,一边看文档一边做,遇到了一些困难的地方,在此记录一下,顺便做个总结: 1.前端分页 2.后端分页 3.模糊查询 前端分页相当简单,在我添加了2w条测试数据的时候打开的很流畅,没有卡顿. $(function(){ a(); }); function a () { $('#yourtable').bootstrapTable({ url: "/user/getUserList/", method:"post", dataType: "json&

  • vue+vuecli+webpack中使用mockjs模拟后端数据的示例

    前言 使用mockjs可以事先模拟数据,前提是和后端约定好了数据接口,怎样的数据.使用mock就可以生成你要的数据了,从而实现开发时前后端分离. 其主要功能是: 基于数据模板生成模拟数据. 基于HTML模板生成模拟数据. 拦截并模拟 ajax 请求. 语法规范 Mock.js 的语法规范包括两部分: 1.数据模板定义规范(Data Template Definition,DTD) 2.数据占位符定义规范(Data Placeholder Definition,DPD) 数据模板定义规范 DTD

  • nuxt+axios解决前后端分离SSR的示例代码

    ​背景:由于后端程序猿通常对CSS .JS掌握不是特别好,通常的开发模式,UI把静态html做好交给程序猿,程序猿开发,把静态html变成动态的时候经常会有各种样式错乱的问题,并且要迎合上级一天三遍样式需求,因此决定用前后端分离.考虑到网站的推广,又必须做SEO.前端框架选择VUE,解决SSR顺便选择了nuxt.js,此为背景. 一.准备工作 1.安装nodejs 2.安装vuejs 3.安装vue-cli 4.安装nuxt 二.创建nuxt项目并配置 找一个自己喜欢的目录,作为你的worksp

  • 详解vue-Resource(与后端数据交互)

    单来说,vue-resource就像jQuery里的$.ajax,用来和后端交互数据的.可以放在created或者ready里面运行来获取或者更新数据... vue-resource文档:https://github.com/vuejs/vue-resource/blob/master/docs/http.md 结合vue-router data(){ return{ toplist:[], alllist:[] } }, //vue-router route:{ data({to}){ //并

  • AngularJS向后端ASP.NET API控制器上传文件

    本文实例介绍了前端AngularJS向后端ASP.NET Web API上传文件的实现方法,具体内容如下 首先服务端: public class FilesController : ApiController { //using System.Web.Http [HttpPost] public async Task<HttpResponseMessage> Upload() { if(!Request.Content.IsMimeMultipartContent()) { this.Requ

随机推荐