机试准备第14天
首先进行树的学习。树的存储分为链式存储与顺序存储。完全二叉树是可以顺序存储的,将各个节点从上往下,从左往右存储。
第一题是找位置,好兄弟给的一道题,一遍过了。
#include <stdio.h>
#include <map>
#include <vector>
#include <algorithm>
#include <string>
#include <iostream>
using namespace std;
struct word{char a;int firstpos;
};
bool cmp(word left, word right){if(left.firstpos < right.firstpos) return true;else return false;
}
int main(){string str;getline(cin, str);map<char, int> repeat;//初始化repeatfor(char i = 'a'; i < 'z';i++){repeat.insert({i, 0});}for(char i = 'A'; i < 'Z';i++){repeat.insert({i, 0});}for(char i = '1'; i < '9';i++){repeat.insert({i, 0});}for(int i = 0; i<str.size();i++){repeat[str[i]]++;}vector<char> rep;//重复元素数组map<char, int>::iterator it;for(it = repeat.begin();it!=repeat.end();it++){if(it->second > 1) rep.push_back(it->first);}vector<word> rep2;//记录重复元素的第一次出现位置for(int i = 0;i<rep.size();i++){word val;val.a = rep[i];for(int j = 0; j<str.size();j++){if(str[j] == rep[i]){val.firstpos = j;break;}}rep2.push_back(val);}sort(rep2.begin(), rep2.end(),cmp);for(int i = 0; i <rep2.size();i++){printf("%c:%d", rep2[i].a, rep2[i].firstpos);for(int j = (rep2[i].firstpos+1); j < str.size();j++){if(str[j] == rep2[i].a) {printf(",%c:%d", rep2[i].a, j);}}printf("\n");}}
第二题是二叉树。
#include <stdio.h>using namespace std;int main() {int m, n;while (1) {scanf("%d%d", &m, &n);if (m == 0 && n == 0) {break;}int i = 1; // 获取层数 从1开始int begin_level; // 存储子树的根在第几层int final_level; // 大树总共有几层// 2^(i-1) ~ 2^i-1// 1 << i ==> 2^iwhile (1) {if (m >= 1 << (i - 1) && m < 1 << i) {begin_level = i;}if (n >= 1 << (i - 1) && n < 1 << i) {final_level = i;break;}++i;}int left_side = m;int right_side = m;for (i = begin_level; i < final_level; ++i) {left_side = 2 * left_side;right_side = 2 * right_side + 1;}int treeNum;// left_side > n 说明 实际的最左最右孩子在倒数第2层// 子树 是一颗 从 begin_level ~ final_level-1 满二叉树if (left_side > n) {treeNum = (1 << (final_level - begin_level)) - 1;}else if (n <= right_side) {treeNum = (1 << (final_level - begin_level)) - 1;treeNum += n - left_side + 1;}else {treeNum = (1 << (final_level - begin_level + 1)) - 1;}printf("%d\n", treeNum);}return 0;}
链式存储的树节点,包含数据域与指针域,指针域分为left与right,指向左右孩子。使用struct定义节点类型。层序建树时要使用队列维持插入位置的信息。层序建树的步骤:1.创建树节点,作为根节点插入,将其left与right位置入队。2.再来新的数据,若数据不是“#”,创建树节点,获取对首,出队,根据对首做插入。新节点的left right位置也要入队。若数据是“#”,直接出队。
#include <iostream>
#include <stdio.h>
#include <queue>
using namespace std;
struct Treenode{char data;Treenode *left;//这里必须用指针 我们已知指针的长度Treenode *right;//Treenode *parent;
};
struct QueueNode{Treenode* parent;bool isleft;
};
void buildTree(Treenode* &proot, queue<QueueNode *> &pos, char data){if(data != '#' ){// 申请一个树节点Treenode * pNew = new Treenode;//(*pNew).data = data;//点的优先级高于*号pNew->data = data;//->与(*).是等价的//申请一个队列的节点QueueNode * pQueueNode = new QueueNode;pQueueNode->parent = pNew;//在队列节点中,保存刚创建的新节点位置pQueueNode->isleft = false;pos.push(pQueueNode);if(proot == NULL){//插入根节点proot = pNew;}else {QueueNode * pCur = pos.front();if(pCur->isleft == false){pCur->parent->left = pNew;pCur->isleft = true;}else {pCur->parent->right = pNew;pos.pop();delete pCur;}}}else {if(proot != NULL){QueueNode* pCur = pos.front();if(pCur->isleft == false){pCur->parent->left =NULL;pCur->isleft = true;}else {pCur->parent->right == NULL;pos.pop();delete pCur;}}}
}
int main(){Treenode* proot = NULL;//有一个指向根节点的指针//若proot为NULL,说明这是一个空树char data;queue<QueueNode*> pos;while(1){scanf("%c", &data);if(data=='\n') break;buildTree(proot, pos, data);}return 0;
}
下面学习树的遍历。分为挂广度优先与深度优先。广度优先即层序遍历,利用队列辅助遍历,深底优先需要借助递归机制,有先序(根左右),中序(左根右),后序(左右根)之分。
层序遍历:
void levelOrder(Treenode *proot){queue<Treenode*> pos;pos.push(proot);while(!pos.empty()){Treenode *pCur = pos.front();pos.pop();printf("%c", pCur->data);if(pCur->left!=NULL) pos.push(pCur->left);if(pCur->right!=NULL) pos.push(pCur->right);}printf("\n");
}
深度遍历:
void PreOrder(Treenode * proot){if(proot == NULL) return;else {printf("%c", proot->data);PreOrder(proot->left);PreOrder(proot->right);}
}
void Inorder(Treenode * proot){if(proot == NULL) return;else {Inorder(proot->left);printf("%d", proot->data);Inorder(proot->right);}
}
void PostOrder(Treenode * proot){if(proot == NULL) return;else {PostOrder(proot->right);PostOrder(proot->left);printf("%d",proot->data);}
}
第三题是二叉树。先构建树,在找节点到根的路径,找交点,距离求和。
#include <stdio.h>
#include <vector>
using namespace std;
struct Treenode{int data;Treenode* left;Treenode* right;Treenode* parent;
};
int main(){int T;scanf("%d", &T);for(int i = 0; i<T;i++){int n,m;scanf("%d%d", &n, &m);vector<Treenode*> nodearr(n+1);for(int j = 1; j<=n;j++){nodearr[j] = new Treenode;nodearr[j]->data = j;}nodearr[1]->parent = NULL;for(int j =1;j<=n;j++){int left,right;scanf("%d%d", &left, &right);if(left!=-1){nodearr[j]->left = nodearr[left];nodearr[left]->parent = nodearr[j];}else{nodearr[j]->left =NULL;}if(right!=-1){nodearr[j]->right = nodearr[right];nodearr[right]->parent = nodearr[j];}else nodearr[j]->right =NULL;}int lhs, rhs;for(int j = 0;j<m;j++){scanf("%d%d", &lhs,&rhs);vector<int> lvec;//得到节点到根的路径vector<int> rvec;Treenode*p = nodearr[lhs];while(p!=NULL){lvec.push_back(p->data);p = p->parent;}p = nodearr[rhs];while(p!=NULL){rvec.push_back(p->data);p = p->parent;}int l = lvec.size()-1;int r = rvec.size()-1;while(1){if(l<0||r<0||lvec[l]!=rvec[r]){break;}--l;--r;}printf("%d\n", l+r+2);}}
}
第四题是二叉树遍历。使用分治法,首先扫描序列,然后读取字符,想要构建树,先设置根,设置左子树,设置右子树。不断分解直到扫描到空叶子"#"。
#include <stdio.h>
using namespace std;
struct TreeNode{char data;TreeNode* left;TreeNode* right;
};
TreeNode* bulitTree(int &i, char str[]){char c = str[i];i++;if(c=='#'){return NULL;}else {TreeNode* pNew = new TreeNode;pNew->data = c;pNew->left = bulitTree(i,str);pNew->right = bulitTree(i, str);return pNew;}
}
void Inorder(TreeNode* root){if(root == NULL){return;}else{Inorder(root->left);printf("%c ", root->data);Inorder(root->right);}
}
int main()
{char str[1000];while(scanf("%s", str)!=EOF){int i =0;TreeNode* proot = bulitTree(i, str);Inorder(proot);printf("\n");}return 0;
}
第五题是重建二叉树。经典老题。已知先序,先找到根,拿根找中序,分解原来的先序与中序,递归处理。
#include <stdio.h>
#include <string>
using namespace std;
struct Treenode{char data;Treenode* left;Treenode* right;
};
Treenode* rebuild(string Preorder, string Inorder){if(Preorder.size() == 0) return NULL;else {char rootdata = Preorder[0];Treenode* node = new Treenode;node->data = rootdata;int pos;for(int i = 0; i< Inorder.size();i++){if(rootdata == Inorder[i]) pos = i;}node->left = rebuild(Preorder.substr(1, pos), Inorder.substr(0, pos));node->right = rebuild(Preorder.substr(pos+1), Inorder.substr(pos+1));return node;}
}
void Postorder(Treenode * root){if(root == NULL){return;}else{Postorder(root->left);Postorder(root->right);printf("%c", root->data);}
}
int main(){char Preorder[30];char Inorder[30];while(scanf("%s%s", Preorder, Inorder)!=EOF){string Preorder1 = Preorder;string Inorder2 = Inorder;Treenode* root = rebuild(Preorder1, Inorder2);Postorder(root);printf("\n");}}
第六题是二叉树。
#include <stdio.h>
#include <vector>
using namespace std;
int main(){int x,y;scanf("%d%d", &x, &y);vector<int> res1;vector<int> res2;if(x==1||y==1) {printf("1");return 0;}else{while(x>1){res1.push_back(x);x=x/2;}res1.push_back(1);while(y>1){res2.push_back(y);y=y/2;}res2.push_back(1);//找到第一个不相等的位置int l = res1.size()-1;int r = res2.size()-1;while(1){if(l<0||r<0||res1[l]!=res2[r]) break;l--;r--;}if(l<0) {printf("%d", res1[0]);return 0;}else if(r<0){printf("%d", res2[0]);return 0;}else {printf("%d", res1[l+1]);return 0;}}
}
第七题是树查找,是找数学关系的一道题。
#include <stdio.h>
#include <vector>
using namespace std;
int main(){int n;scanf("%d", &n);vector<int> vec(n+1);for(int i = 1;i<=n;i++){scanf("%d", &vec[i]);}int k;scanf("%d", &k);//第k层的节点编号为2^(k-1) ~ 2^k - 1int left = 1<<(k-1);int right = (1<<k)-1;if(left>n) printf("EMPTY");else if(left<=n&&right>=n) {while(left<=n){printf("%d ", vec[left]);left++;}}else if(n>right){for(int i =left;i<=right;i++){printf("%d ", vec[i]);}}
}
第八题是前序遍历。爆内存了。
#include <stdio.h>
#include <vector>
#include <algorithm>
using namespace std;
struct Treenode{int data;Treenode* left;Treenode* right;
};
Treenode* built(vector<int> Postorder, vector<int> Inorder){if(Postorder.size() == 0) return NULL;else {int rootdata = Postorder[Postorder.size()-1];int pos =0;//根节点在中序序列中的位置for(int i = 0;i<Inorder.size();i++){if(Inorder[i] == rootdata){pos = i;break;} }Treenode* proot = new Treenode;proot->data = rootdata;vector<int> newPosterosderleft;vector<int> newPosterosderright;vector<int> newInorderleft;vector<int> newInorderright;for(int i = 0;i<pos;i++){newInorderleft.push_back(Inorder[i]);}for(int i = pos+1;i<Inorder.size();i++){newInorderright.push_back(Inorder[i]);}for(int i = 0; i<newInorderleft.size();i++){newPosterosderleft.push_back(Postorder[i]);}for(int i = newPosterosderleft.size();i<Postorder.size()-1;i++){newPosterosderright.push_back(Postorder[i]);}proot->left = built(newPosterosderleft, newInorderleft);proot->right = built(newPosterosderright, newInorderright);return proot;}
}
void Preorder(Treenode* root, int &num){if(root == NULL) return;else{num = root->data;//printf("%d", num);Preorder(root->left, num);Preorder(root->right, num);}
}
int main(){int n;scanf("%d", &n);vector<int> Postorder(n);vector<int> Inorder(n);for(int i = 0;i<n;i++){scanf("%d", &Postorder[i]);}for(int i = 0;i<n;i++){scanf("%d", &Inorder[i]);}//读入序列Treenode* root= built(Postorder, Inorder);int res=0;Preorder(root, res);printf("%d", res);
}
相关文章:
机试准备第14天
首先进行树的学习。树的存储分为链式存储与顺序存储。完全二叉树是可以顺序存储的,将各个节点从上往下,从左往右存储。 第一题是找位置,好兄弟给的一道题,一遍过了。 #include <stdio.h> #include <map> #include &…...
【Academy】OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities
OAuth 2.0 身份验证漏洞 ------ OAuth 2.0 authentication vulnerabilities 1. 什么是 OAuth?2. OAuth 2.0 是如何工作的?3. OAuth 授权类型3.1 OAuth 范围3.2 授权代码授权类型3.3 隐式授权类型 4. OAuth 身份验证4.1 识别 OAuth 身份验证4.2 侦察OAuth…...
有关Java中的多线程
学习目标 ● 掌握线程相关概念 ● 掌握线程的基本使用 ● 掌握线程池的使用 ● 了解解决线程安全方式 1.为什么要学习线程? ● 从1946年2月14日世界上第一台计算机在美国宾夕法尼亚大学诞生到今天,计算和处理的模式早已从单用户单任务的串行模式发展到了多用户多…...
【eNSP实战】配置交换机端口安全
拓扑图 目的:让交换机端口与主机mac绑定,防止私接主机。 主机PC配置不展示,按照图中配置即可。 开始配置之前,使用PC1 ping 一遍PC2、PC3、PC4、PC5,让交换机mac地址表刷新一下记录。 LSW1查看mac地址表 LSW1配置端…...
MAC-禁止百度网盘自动升级更新
通过终端禁用更新服务(推荐) 此方法直接移除百度网盘的自动更新组件,无需修改系统文件。 步骤: 1.关闭百度网盘后台进程 按下 Command + Space → 输入「活动监视器」→ 搜索 BaiduNetdisk 或 UpdateAgent → 结束相关进程。 2.删除自动更新配置文件 打开终端…...
LLMs基础学习(一)概念、模型分类、主流开源框架介绍以及模型的预训练任务
文章目录 LLM基础学习(一)一、大语言模型(LLMs)的简单介绍定义与基本信息核心特点局限性参考的模型 二、大语言模型(LLMs)名称后 “175B”“60B”“540B” 等数字的含义数字代表模型参数数量具体示例参数数…...
【leetcode hot 100 24】两两交换链表中的节点
解法一:先判断链表是否为空,若为空则直接返回;否则用left和right指向第一个和第二个节点,当这两个节点非空时一直执行交换。其中先判断right.nextnull,说明链表为偶数且已经交换完break;再判断right.next.n…...
软件IIC和硬件IIC的主要区别,用标准库举例!
学习交流792125321,欢迎一起加入讨论! 在学习iic的时候,我们经常会遇到软件 IC和硬件 IC,它两到底有什么区别呢? 软件 IC(模拟 IC)和硬件 IC(外设 IC)是两种实现 IC 总线通信的方式…...
Codeforces Round 1006 Div3 A-E
A 题目描述 夏目章人(Natsume Akito)刚刚在一个新世界苏醒,便立即收到了他的第一个任务!系统为他提供了一个包含 n 个零的数组 a,以及两个整数 k 和 p。在每次操作中,章人需要选择两个整数 i 和 x&#x…...
4个 Vue 路由实现的过程
大家好,我是大澈!一个喜欢结交朋友、喜欢编程技术和科技前沿的老程序员👨🏻💻,关注我,科技未来或许我能帮到你! Vue 路由相信朋友们用的都很熟了,但是你知道 Vue 路由…...
git文件过大导致gitea仓库镜像推送失败问题解决(push failed: context deadline exceeded)
问题描述: 今天发现gitea仓库推送到某个镜像仓库的操作几个月前已经报错终止推送了,报错如下: 首先翻译报错提示可知是因为git仓库大小超过1G限制。检查本地.git文件,发现.git文件大小已达到1.13G。确定是.git文件过大导致&…...
简要分析NETLINK_ROUTE参数
NETLINK_ROUTE时Linux内核中Netlink协议族的一个子类型,专用于用户空间与内核网络子系统之间的通信,它是实现动态网络配置(如路由表、网络接口、地址管理)的核心机制,为现代网络管理工具(如iproute2&#x…...
Java中default关键字
1. 在 switch 语句中作为默认分支 在 switch 语句里,default 用于定义当所有 case 标签的值都无法匹配 switch 表达式的值时要执行的代码块。它并非强制要求,但使用它可以增强代码的健壮性,处理未预见的情况。 public class SwitchDefaultE…...
怎么利用DeepSeek进行PCB设计?
最近在琢磨利用Deepseek改善PCB的细节设计,毕竟立创EDA里面没有集成DS,因此,如何让DS能识别图片成了重中之重。所幸最近腾讯元宝里面集成了R1的满血版,这个版本可以上传图片,于是让DS识别图片就可能了。 在原理图设计…...
详细介绍 Jupyter nbconvert 工具及其用法:如何将 Notebook 转换为 Python 脚本
nbconvert 是 Jupyter 提供的一个非常强大的工具,允许用户将 Jupyter Notebook 文件(.ipynb)转换成多种格式,包括 Python 脚本(.py)、HTML、PDF、LaTeX 等。你可以通过命令行来运行 nbconvert,也…...
windows上传uniapp打包的ipa文件到app store构建版本
uniapp是一个跨平台的框架,使用windows电脑也可以开发ios软件,因为uniapp的打包是在云端实现的,本地电脑无需使用mac电脑即可完成打包。 但是打包后的ipa文件需要上架到app store的构建版本上,没有mac电脑,又如何上架…...
PySide(PyQT),QGraphicsItem的pos()和scenePos()区别
在QGraphicsItem中,pos()和scenePos()是两个重要的方法,用于描述图形项的位置,但它们的含义和用途有所不同。理解它们的区别对于正确操作和管理QGraphicsItem的位置至关重要。 1. pos()方法 • 定义:pos()返回的是QGraphicsItem在…...
idea 快捷键 Reformat code
Reformat code...
Spring Boot 项目中使用责任链模式实现复杂接口解耦和动态编排(带示例)
目录 责任链模式概述 解耦 动态编排 运用场景 代码示例 1. 定义请求和响应对象 2. 定义处理者接口和抽象处理者类 3. 实现具体的处理者类 4. 配置责任链 5. 控制器类调用责任链 代码解释 责任链模式概述 责任链模式是一种行为设计模式,它允许你将请求沿着处理者链…...
消防设施操作员考试备考:以技巧为翼,翱翔知识天空
消防设施操作员考试的备考过程中,掌握实用技巧能让学习事半功倍。以下为您介绍一系列备考技巧,助您在知识的天空中自由翱翔。 记忆技巧:化繁为简 消防知识众多,记忆难度较大。可以采用多种记忆方法,如口诀记忆法…...
qt之No executable specified
在Qt中遇到文件复制操作时出现“No executable specified”错误,通常与程序编译或运行环境配置问题相关,而非文件操作本身的问题。以下是可能的原因及解决方案: 项目配置文件损坏 现象: 在执行文件操作前,程序无法启动…...
物联网商业模式
物联网商业模式是一种战略规划,它融合了物联网技术来创造价值并获取收入。它与传统商业模式的不同之处在于,它利用互联设备来改善运营、提升客户体验以及优化服务项目。在当今由科技驱动的世界中,这种商业模式通过利用实时数据来提供创新服务…...
解决ElementPlus对话框el-dialog中关闭事件重复触发问题
问题背景 在使用ElementPlus的el-dialog组件时,发现点击取消按钮会触发两次关闭事件: 1. 第一次参数为PointerEvent(事件对象) 2. 第二次参数为undefined 需要确保点击取消按钮时仅触发一次有效关闭事件,并传递正确…...
【RabbitMQ】事务
事务的简单配置及使用 配置事务管理器声明队列生产者代码测试 RabbitMQ是基于AMQP协议实现的,该协议实现了事务机制,因此RabbitMQ也支持事务机制. SpringAMQP也提供了对事务相关的操作.RabbitMQ事务允许开发者确保消息的发送和接收是原子性的,…...
算法刷题--贪心算法
要点 其实也没啥要点,就是求局部最优解,完事了将局部最优解汇总、筛选、max\min之类的,获得全局最优解,每一次都选择最优的,这个就是贪心算法。 例题 分发饼干-中等 大概就是一堆小孩g,每个人都有一个胃口g[i]&…...
MVCC的理解(Multi-Version Concurrency Control,多版本并发控制)
1.事务特性(ACID) 原子性:事务要么全部成功,否则全部回滚 一致性:保证逻辑完整性(关联表删除) 隔离性:事务并发隔离(行锁,间隙锁) 持久性:已提交的事务永…...
CCF-CSP第24次认证第2题 --《序列查询新解》
4281. 序列查询新解 - AcWing题库 上一题“序列查询”中说道: A[A0,A1,A2,⋯,An]A[A0,A1,A2,⋯,An] 是一个由 n1n1 个 [0,N)[0,N) 范围内整数组成的序列,满足 0A0<A1<A2<⋯<An<N0A0<A1<A2<⋯<An<N。 基于序列 AA&#…...
Webpack 打包详细教程
Webpack 是一个现代 JavaScript 应用的静态模块打包工具,它可以处理 JavaScript、CSS、图片等资源,并优化它们以提高性能。以下是 Webpack 从基础到进阶的详细教程。 1. Webpack 基础概念 Webpack 的核心概念包括: Entry(入口&a…...
每日一题----------集合
数组: (1)长度开始必须指定,而且一但指定,不能修改。 (2)保存的必须为同一类型的元素。 (3)使用数组进行增加元素的代码--比较麻烦。 如果要添加数据则需要ÿ…...
滑动窗⼝(同向双指针)---最⼤连续1的个数III
题目链接 给定一个二进制数组 nums 和一个整数 k,假设最多可以翻转 k 个 0 ,则返回执行操作后 数组中连续 1 的最大个数 。 示例 1: 输入:nums [1,1,1,0,0,0,1,1,1,1,0], K 2 输出:6 解释:[1,1,1,0,0,…...
