- 博客(21)
- 收藏
- 关注
原创 数组中数值变为给定target
今天做了一道某大讯飞的题目,虽然考试时候没完全写出来,但是考完还是把它写完了。写程序+调试bug花费2h,属实菜鸡!以下是题目原型:已知一个长度为n的正整数数组number,下标从0到n-1,最多可以操作k次,每一次操作,挑选任意一个下标i(0<=i<=n),将numberi重新取值,假设此次操作前numberi值为ai,操作后为b,只要满足|a-b|<=2,且b为正整数,那么操作成功,否则操作失败,numberi的取值重新变为a.同一个下标可以被重复选择,只要操作成功,那么取
2021-09-12 22:37:19
680
原创 反转链表的两种方法
反转链表的两种方法(一)先保存下一节点,将当前节点指向自己的前一节点。/*struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) { }};*/class Solution {public: ListNode* ReverseList(ListNode* pHead) { ListNode* cur = pHead; Li.
2021-09-08 20:27:56
1671
原创 2021-09-07字符串解压缩
今天分享一道字符串解压缩的题目:问题小Q想要给他的朋友发送一个神秘字符串,但他发现字符串的长度过长,于是小Q发明了一种压缩算法对字符串重复的部分进行了压缩。对于字符串内连续的m个相同的子串s将会压缩为m|s。例如字符串ABCABCABC会被压缩为[3,ABC],现在小Q的同学收到了小Q发送过来的字符串,你能帮助还原字符串吗?压缩算法描述:被压缩的子串长度不超过1000,子串仅包含大写字母和[、]、,字符。算法扫描整个字符串,遇到连续相同的子串,对子串进行压缩,输出压缩后的格式字符串,若.
2021-09-07 21:08:18
1233
原创 C++虚析构函数
Q:C++中析构函数能不能是虚函数?A:我是最近才注意到这个问题,首先是笔试的时候遇到过,当时根本不会,后来去查了一下,一知半解,大都说析构函数常常为虚函数,还有的人说必须是,后来面试的时候面试官正好问了,我也没讲太清楚,所以觉得有必要再重新梳理一下。严谨的说,C++在有继承发生的时候,必须要把基类的析构函数写为虚函数,如果不这么做,在释放资源时,只会释放基类的资源,而不会释放子类的,造成内存泄漏。但是如果是没有继承,那就完全没必要把析构函数写为虚函数了,因为我们知道,对于有虚函数的类,C++都会为
2021-09-06 13:22:45
161
原创 C++中的虚函数表
面试中遇到最多的问题就是多态的概念,以及多态的实现依据,首先多态发生的条件:(1)必须要有子类继承父类(2)父类中存在虚函数,并且子类重写该虚函数(3)父类的指针或者引用指向子类对象这三个条件缺一不可。那么多态究竟是怎么实现的呢?那就不得不提到虚函数表,在每一个实例化的子类对象的头部,首先是一个指向虚函数表的指针,那么虚函数表中依次存放着父类的方法和子类特有的方法,如果子类重写父类的方法,那么就会替换父类的方法,否则的话就照抄。下面给出一个示意图。这里面需要注意的是,虚函数表并不是共.
2021-09-05 16:33:59
2015
原创 找出数组中第k大的值
最近在LeetCode上刷了一道题,是要找出数组中第K大的值,我试着用快排序写了一下,整体思路还是比较简单的,有空再更新一下,把这个方法做一下改进。#include<iostream>#include<vector>#include<algorithm>using namespace std;class solution{public: int FindkthLargest(vector<int>& v, int left,
2021-09-04 23:30:24
247
原创 类外访问类的私有(保护)成员
在C++中类外访问类的私有(private)或保护(protected)成员变量,有以下几种方法:(1)通过在类中定义共有的成员函数,用成员函数去调用类的私有成员变量,在类外就可以实现对私有成员变量的访问;(2)在类外实例化一个类的对象,定义一个类的指针,并将其赋值为该对象的地址,再定义一个整形指针变量,赋值为该类指针,那么对该指针变量解引用就得到第一个成员变量的值,还可以修改值;(3)通过友元类或者友元函数访问。class myclass{public: friend void my
2021-09-01 20:02:19
9419
1
原创 重新排列句子中的单词
题目描述「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :句子的首字母大写text 中的每个单词都用单个空格分隔。请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。请同样按上述格式返回新的句子。示例 1:输入:text = "Leetcode is cool"输出:"Is cool leetcode"解释:句子中共有 3 个单词,长度为 8 的 "Leetcode" ,长度为 2 的
2021-08-31 11:09:59
723
原创 函数模板的使用
函数模板还是比较强大的,大家都知道函数模板可以增加代码的复用性,提高编程效率。但殊不知函数模板其实还分为三种情况,隐式实例化、显式实例化、显示具体化。下面逐一来说明。(1)隐式实例化最常使用的函数模板形式,在使用模板之前,编译器不生成模板的声明和定义实例。只有当使用模板时,编译器才根据模板定义生成相应类型的实例。(2)显式实例化当显式实例化模板时,在使用模板之前,编译器根据显式实例化指定的类型生成模板实例。这样做会提高代码执行的效率,就不用了在每次调用时去推导参数类型。(3)显式具体化
2021-08-29 21:49:43
4947
原创 重建二叉树
给定某二叉树的前序遍历和中序遍历,请重建出该二叉树并返回它的头结点。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出如下图所示。输入:[1,2,4,7,3,5,6,8],[4,7,2,1,5,3,8,6]复制返回值:{1,2,3,4,#,5,6,#,7,#,#,8}复制说明:返回根节点,系统会输出整颗二叉树对比结果解题思路:1.知道二叉树的前序遍历结果,可以得知第一个点即为二叉树的根结.
2021-08-27 10:40:53
102
原创 C++中的智能指针
C++里面有四个智能指针,分别为auto_ptr, unique_ptr, shared_ptr, weak_ptr,其中auto_ptr已经被c++11弃用。智能指针的作用是管理一个指针。因为存在以下现象:申请的空间在函数结束时忘记释放,造成内存泄漏,使用智能指针可以避免这个问题,因为智能指针是一个类,当超出了这个类的作用范围,类会自动调用析构函数,进而释放资源,所以智能指针的原理就是在函数结束时自动释放内存空间,不需要手动释放内存空间。1.auto_ptr:存在潜在的内存崩溃问题!将一个
2021-08-25 11:25:21
182
原创 堆排序(c++实现)
堆排序是一种选择排序,利用堆这种数据结构来完成选择,其算法思想是将待排序数据构造为一个大根堆(小根堆),然后将堆顶元素与待排序数组最后一个元素进行交换,此时末尾元素就是最大值(最小值),然后将剩余n-1个元素重新构造成大根堆(小根堆),重复以上操作。 堆是一个完全二叉树,大根堆满足根结点元素均大于其孩子结点,(小根堆满足根结点元素均小于其孩子结点),大根堆小根堆示意图如下: 堆排序用c++实现,自己编写的代码,虽然思想很简单,但是编起来还是遇到了一些b...
2021-08-16 22:21:46
574
1
原创 手写快速排序代码
一、快速排序简介 快速排序(Quick Sort)是由冒泡排序改进而来的,冒泡排序一次交换只能消除一个逆序,效率比较低,如果能通过一次交换消除多个逆序,那么会提高排序效率,快速排序就具有这样的功能。 快速排序的原理是选定一个中心点middle,通过一次排序,将不大于middle的元素都放在了其左侧,不小于middle的元素都放在了右侧,再对其左右区间进行类似的操作,直到所有区间长度为1。 快速排序的基本方法:(1)选定一个基准值middle(2...
2021-08-14 23:30:52
592
原创 手写代码:两个栈实现一个队列
class Solution{public: void push(int node) { stack1.push(node);//将新加的元素压入stack1中 } int pop() { if(stack2.empty()) //只要stack1不为空,就将里面的元素压入stack2 { while (!stack1.empty()) { stac.
2021-08-13 23:17:05
114
原创 B-树、B+树
一、B树 B树是一种平衡多叉树,磁盘系统中的目录管理,以及数据库系统中的索引组织多数都采用B树,B树的定义如下: 一颗m阶的B树,满足以下特性:1.树中的每个结点至多有m棵子树;2.若根结点不是叶子结点,则至少有两颗子树;3.除根节点之外的非终端节点至少有-1个关键字;4.所有叶子结点出现在同一层次上,并且不携带任何信息。5.结点中的关键字都是有序的,且关键字Ki左子树的关键字均小于Ki,右子树关键字均大于Ki; B树的示意图如下:...
2021-08-13 21:31:46
342
1
原创 按层次遍历二叉树
最近在牛客上刷到一道题目,是遍历二叉树,是按照从左到右的顺序,也即bfs,最后输出一个二维数组,里面记录了每一层的元素。具体题目如下: 下面给出C++的解题方法/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL)...
2021-08-13 15:28:49
299
原创 二叉搜索树的第k个节点
一、问题描述二、c++解题 看到这道题,首先要想到用递归的方法做,递归的代码实在是优美神奇。关键是简洁,但有时候并不明了,看了之后一头雾水,所以今天分享一下牛客上大佬给出的非递归的方法。 这道题应该是采用左中右中序遍历二叉树,因为中序遍历其实就是给二叉树排序,我们虽然不用递归,但还是要去模拟一下堆栈的感觉,创建一个栈stack<TreeNode *> s,把遍历的结点依次压进去,先遍历左节点的左子树,一直遍历到结点为null为止,此时里面存储的都是小...
2021-08-13 11:09:15
129
原创 普通查找、二分查找、二叉查找树、平衡二叉树、红黑树
一、普通查找 给定一个数组,要从中找到某一个元素,最简单粗暴的方法莫过于直接查找,从第一个元素开始找起,依次和要查找的元素进行对比,如果不相同,那么继续往下找,直到找到为止,普通查找如下图所示: 采用这种方法查找元素的时间复杂度为O(n),当数组长度很大时,查找效率非常低。二、二分查找(Binary Search) 二分查找是一种比普通查找方法快的一种查找方式,但前提是要查找的数组已经是有序序列,这种方法的原理是设置两个指针,左指针l,右指针r,分...
2021-08-12 23:04:26
777
1
原创 哈夫曼树和哈夫曼编码
一、几个重要概念1.哈夫曼树:又称最优树,是一类带权路径长度最短的树。2.路径:从树中一个结点到另一个结点之间的分支构成这两个结点之间的路径3.树的路径长度:从树根到每一个结点的路径长度之和4.权:结点权或者边权5.结点带权路径长度:从该结点到根结点之间的路径长度与结点权值乘积之和6.树的带权路径长度:所有叶子结点的带权路径长度之和二、哈夫曼树的构造方法如上图所示,一共有四个结点,构造一颗哈夫曼树,步骤如下:(1)首先从n个权值集合中找到最小的两个,并且选择其根结点.
2021-08-12 11:40:59
292
1
翻译 找到一个数组中每一个元素第一个比它大的元素
一、题目描述 给定义个数组v,对于数组中每一个元素,找到其后面元素中第一个比它大的元素,并且记录在数组v2中返回。例如给定数组v = {1,3,6,-1,2},返回v2={3,6,-1,2,-1}。(如果找不到,记为-1),并且要求时间复杂度应该为O(N)。二、解题思路 可能看到这道题,大家首先会想到对于数组中的元素一个一个去遍历,进而找到第一个比它大的元素,但是这种做法的时间复杂度应该为O(n**2),因此不可采用此种方法。 进一步去思考,发现可以...
2021-08-11 20:05:21
1507
原创 vector和list的区别
文章目录前言 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结一、vector和list的区别?1.vector底层实现是数组,list是双向链表2.vector支持随机访问,list不支持3.vector是顺序内存,list不是4.vector在中间节点进行插入数据会导致内存拷贝,list不会5.vector一次性分配好内存,不够时才进行2倍扩充,list每次插入新节点都会进行内存扩充6.vector插入删除性...
2021-08-11 11:26:14
3086
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人