
C++
qq_20880939
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
面试题·03.02
请设计一个栈,除了常规栈支持的pop与push函数以外,还支持min函数,该函数返回栈元素中的最小值。执行push、pop和min操作的时间复杂度必须为O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.getMin(); --> 返回 -3.minStack.pop();minStack.top(); ...原创 2020-06-16 20:27:20 · 206 阅读 · 0 评论 -
面试题03.01 三合一
三合一。描述如何只用一个数组来实现三个栈。你应该实现push(stackNum, value)、pop(stackNum)、isEmpty(stackNum)、peek(stackNum)方法。stackNum表示栈下标,value表示压入的值。构造函数会传入一个stackSize参数,代表每个栈的大小。示例1:输入:["TripleInOne", "push", "push", "pop", "pop", "pop", "isEmpty"][[1], [0, 1], [0, 2], .原创 2020-06-15 22:30:32 · 338 阅读 · 0 评论 -
面试题02.07 链表相交
题目大概练过leetcode的链表部分估计都做过这道题;示例 1:输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3输出:Reference of the node with value = 8输入解释:相交节点的值为 8 (注意,如果两个列表相交则不能为 0)。从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。在 A 中,相交节点前原创 2020-06-14 22:10:24 · 267 阅读 · 0 评论 -
判断一个回文链表
示例 1:输入: 1->2输出: false 示例 2:输入: 1->2->2->1输出: true /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {} * }; */class Solution {.原创 2020-06-11 07:00:55 · 205 阅读 · 0 评论 -
面试02.05 链表求和
示例:输入:(7 -> 1 -> 6) + (5 -> 9 -> 2),即617 + 295输出:2 -> 1 -> 9,即912最麻烦的代码,最易理解的思路;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(x), next(NULL) {}原创 2020-06-10 23:10:30 · 248 阅读 · 0 评论 -
面试题02.02 返回倒数第k个节点
实现一种算法,找出单向链表中倒数第k个节点,返回该节点的值;示例:输入: 1->2->3->4->5 和 k = 2输出: 4分析: 可以先遍历一遍链表,计算链表的长度;然后根据正反向关系就可以得到节点;/** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; * ListNode(int x) : val(原创 2020-06-10 22:14:48 · 221 阅读 · 1 评论 -
面试题02.01 移除重复点
编写代码,移除未排序链表中的重复节点。保留最开始出现的节点;示例:输入:[1,2,3,3,2,1]输出:[1,2,3]分析: 使用辅助哈希表来判断当前链表上的点是否已经在之前的链表上存在过,如果没有存在,则将该链表的节点添加在新的链表的节点上。此时注意要将这个链表节点值添加在哈希表上,为了方便下一次判断。如果存在了,则不用添加;/** * Definition for singly-linked list. * struct ListNode { * int val;原创 2020-06-10 21:56:43 · 209 阅读 · 0 评论 -
面试题01.09 字符串轮转
字符串轮转。给定两个字符串s1和s2,请编写代码检查s2是否为s1旋转而成(比如,waterbottle是erbottlewat旋转后的字符串)。示例1:输入:s1 = "waterbottle", s2 = "erbottlewat"输出:True下面是我参考的解答: 只能用陈独秀来形容了;class Solution {public: bool isFlipedString(string s1, string s2) { return s1.siz...原创 2020-06-09 22:14:42 · 275 阅读 · 0 评论 -
面试题01.08 零矩阵
编写一种算法,若M*N矩阵中的某个元素为0,则将其所在的行与列置为0;示例 1:输入:[ [1,1,1], [1,0,1], [1,1,1]]输出:[ [1,0,1], [0,0,0], [1,0,1]]分析: 遍历这个二维数组,分别生成行向量数组与列向量数组用于记录0的所在的行与列;然后再次遍历这个数组,将零所在的行与列置为0;class Solution {public: void setZeroes(vector<vector<...原创 2020-06-09 21:33:00 · 251 阅读 · 0 评论 -
Leetcode15 三个数之和
本题暴力法解决肯定超时。。参考大神的正确做法,时间复杂度是O(n^2), 空间复杂度是O(1).做法仍然是双指针的思路,这个双指针并不是从头开始,由于是三个数,所以先固定一个数,然后在这个数剩余部分做双指针遍历。所以首先自然想到要进行排序。。然后在排序后遍历过程中可以提前停止,停止条件是遍历到大于0的元素。class Solution: def threeSum(...原创 2020-01-22 20:41:11 · 222 阅读 · 0 评论 -
数据结构 实现二叉树的遍历
数据结构中,实现二叉树遍历的方式有两种,一种是递归遍历,另外一种是非递归遍历。本文考虑非递归遍历的情况。在非递归遍历的实现中,需要构造一个链式栈来暂存树中节点,具体实现代码如下:// 二叉树的非递归实现#include<stdio.h>#include<stdlib.h>typedef struct BNode { char data; struc...原创 2019-11-26 16:40:20 · 179 阅读 · 0 评论 -
数据结构 实现二叉树的遍历
【二叉树的遍历】二叉树的遍历方式有四种: 前序遍历,中序遍历,后序遍历,层次遍历。其中前三种遍历方式二叉树常用的遍历方式。【代码实现遍历】当实现二叉树的遍历时,递归是实现前序遍历,中序遍历与后序遍历的最简单的方式,因为树的结构本身就是一种层次上不同,但结构是一致的,利用递归思想写出的代码简洁易懂。// 二叉树三种遍历递归实现#include<stdio.h>#in...原创 2019-11-26 15:14:40 · 199 阅读 · 0 评论 -
数据结构 栈
【栈的基本概念】当我们清楚了线性表的概念后,接着可以学习栈了。栈是一种运算受限的线性表。限定仅在表尾进行插入与删除操作的线性表。这一端被称为栈顶,相对地,把另外一端称为栈底。向一个栈掺入新元素的过程称为进栈、入栈或者压栈,它是将新元素放到栈顶元素上面,使之成为新的栈顶元素;从一个栈删除元素又称为出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。【栈的结构示意图】...原创 2019-11-26 10:11:38 · 190 阅读 · 0 评论 -
单向链表反转问题
下面内容来自: https://blog.csdn.net/blioo/article/details/62050967假设当前创建好的链表如下:首先让头结点与第一个元素节点断开,但是要注意在断开之前需要用p指针指向第一个元素节点来保存第一个元素节点位置,然后在断开。在这里有一个指针q指向一个指针域为空的节点,这个节点用来作为链表反转后的最后一个节点。让第二个元素节点的指针从...转载 2019-11-25 14:51:00 · 176 阅读 · 0 评论 -
数据结构 链表
https://www.cnblogs.com/notfound/p/8529692.html 【单链表】https://blog.csdn.net/qingzhuyuxian/article/details/81478043 【双向链表】https://www.cnblogs.com/dengfaheng/p/9245770.html 【循环链表】https://blog.csd...转载 2019-11-24 14:15:09 · 111 阅读 · 0 评论 -
线性表的顺序存储结构————顺序表(包含C语言和C++版本的完整程序)
https://blog.csdn.net/wanzhen4330/article/details/81627034转载 2019-11-24 12:07:51 · 238 阅读 · 0 评论 -
C++ List
【List容器结构】List是一个双向链表容器,结构如上图所示。可以高效地进行插入删除元素。list不可以随机存取元素,所以不支持at(pos)函数与[]操作符。#include<list>【list 的相关函数】list相关函数在vector与deque中已经大量出现,下面进行代码的简要介绍【assign】#include<iostream&g...原创 2019-11-24 09:04:14 · 159 阅读 · 0 评论 -
c++ Deque容器
【Deque 容器结构】deque是双向开口的连续线性空间(动态将多个连续空间通过指针数组接合在一起),随时可以增加一段新的空间,所以数据想vector里面的分配,复制,释放操作不会发生。deque头尾两端分别做插入和删除操作都是常数时间。能用vector尽量使用vector,通过deque用来做队列即可,十分方便的。【deque 用法】容器deque和容器vector非常相似,属...原创 2019-11-23 15:51:09 · 179 阅读 · 0 评论 -
C++ Vector容器
【Vector容器的结构】【Vector容器简介】1. Vector是将元素置于一个动态数组中加以管理的容器。(所以Vector结构长上面那样)2. Vector容器可以随机存取元素,(支持索引值直接存取, 用[]操作符或者at()方法)3. Vector尾部添加或者移除元素非常快速,但是在中间或者头部插入元素或者移除元素比较费时(由上面结构可以看出)【Vector的...原创 2019-11-21 21:56:23 · 274 阅读 · 0 评论 -
C++ STL基本概念
【STL基本概念】在C++中, STL(Standard Template Library,标准模板库)从广义上可以分为三类: algorithm(算法),container(容器),iterator (迭代器), 算法与容器通过迭代器可以进行无缝的连接。几乎所有的代码都采用了模板类与模板函数的方式,这相比于传统的由函数与类组成的库来说提供了更好的代码重用机会。在c++标准中,STL被...原创 2019-11-21 20:36:47 · 275 阅读 · 0 评论 -
数据结构6 插入排序
数据结构中,相关资料显示,效率低的排序算法共有3种,分别为冒泡排序,选择排序,与插入排序。在其余的两篇博客中,我分别介绍了冒泡排序与选择排序,接下来介绍最后一种排序: 插入排序。相关资料显示,在实际开发的过程中,插入排序比其他两种排序更为常用。那么何为插入排序?那么上面基础的 插入排序代码如下(为了表达一般性,利用函数模板):#include<iostream>...原创 2019-11-21 18:36:41 · 148 阅读 · 0 评论 -
c++ 纯虚函数与抽象类
c++中, 纯虚函数基于多态。1. 纯虚函数是一个在基类中说明的虚函数,在基类中没有定义,要求任何派生类都定义自己的版本。2. 纯虚函数为各派生类提供一个公共界面。3. 一个具有纯函数的基类称为抽象类。下面是一个面向抽象类编程的简单实例。#include<iostream>using namespace std;class Figure {public...原创 2019-11-21 11:21:26 · 123 阅读 · 0 评论 -
c++ 多态面试题的强化
内容来自: 传智播客原创 2019-11-20 14:57:06 · 169 阅读 · 0 评论 -
构造函数中调用虚函数,能实现多态吗?
内容来源: 传智播客c++面试中常常会问到一个问题:通过子类对象,在父类构造函数中调用虚函数,能实现多态吗?#iinclude<iostream>using namespace std;class A {public: int a; A(int a) { this->a = a; print(); } virtual void print() ...原创 2019-11-20 14:42:31 · 468 阅读 · 0 评论 -
c++ 多态原理剖析
内容来自: 传智播客 (学习C++基础的朋友,我强烈推荐传智播客的传智扫地僧的课程,真是我迄今为止见过将C++讲的最好的老师,没有别人。。)#include<iostream>using namespace std;// 多态class A {public: int a; A(int a) { this->a = a; } virtual void ...原创 2019-11-20 11:08:14 · 267 阅读 · 0 评论 -
数据结构5 递归
【递归】递归是一种重要的编程思想,通常是指在函数的定义中使用函数自身的方法。也就是说,递归算法是一种直接或者间接调用自身函数或者方法的算法。递归算法的意义在于将问题分解成规模缩小的同类问题的子问题,然后递归调用方法来表示问题的解。下图展示的是一个简单的阶乘的递归调用实例:从上面递归调用图中可以得到一下结论:1. 我们可以将递归调用过程看做一个栈的数据结构,先调用的函数先入...原创 2019-11-19 19:27:53 · 262 阅读 · 0 评论 -
数据结构4 顺序查找与折半查找
【顺序查找 (针对无序的数据,有序的数据可以用更高效的数据查找方式)】在无序的数据查找中, 顺序查找是最入门、最简单的算法,该算法虽然简单,但是当数据量增多时,查找效率较低。比如在100万数据中,平均需要查找大约50万次,从算法角度来说,是很难接受的。从算法角度来说,很自然要考虑到算法的优化。经过查找相关,关于无顺序数据处理,在数据库中有对应处理方法,还有可以创建索引,哈希方式处理等,嗯,...原创 2019-11-19 16:15:15 · 1440 阅读 · 0 评论 -
数据结构3 选择排序
【选择排序】选择排序算法与冒泡排序算法在性质上差不多,选择排序比冒泡排序的性能稍微好一点。主要原因在于冒泡排序每次在比较时同时可能要交换数据,因交换次数过多,所以传统的冒泡算法时间复杂度高。选择排序与冒泡算法本质上不同是: 选择排序设置一个标志量,根据这个标志量,只在每次扫描最后交换一次数据,而不像冒泡排序不停交换数据。相比于冒泡排序,选择排序是一种不稳定的排序算法。如何理解选择算法的...原创 2019-11-19 12:42:33 · 143 阅读 · 0 评论 -
数据结构2 冒泡排序
【数据结构--冒泡排序】冒泡排序是数据结构的第一个算法,,也是最简单的一个排序算法。冒泡排序就是把小的元素往前调或者把大的元素往后调。相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。【基本的冒泡...原创 2019-11-18 18:45:00 · 388 阅读 · 0 评论 -
c++ 重载、重写、重定义
代码来源: 传智播客我认为这个代码完美展示了重载、重写与重定义区别。另外,还有在重写后的子类同名函数会对父类同名函数产生覆盖问题。(我认为这个细节问题的原因在于: 你这样调用基于的出发点是函数重载, 但是不要忘记重载前提是只能发生在同一个类中。所以子类同名函数会对父类函数产生覆盖。。)#include<iostream>using namespace std;//...原创 2019-11-18 10:51:55 · 207 阅读 · 0 评论 -
c++ 虚析构函数
虚析构函数:虚析构函数为了解决 基类的指针指向派生类对象,并用基类的指针删除派生类对象。如果某个类不包含虚函数,那一般是表示它将不作为一个基类来使用。当一个类不准备作为基类使用时,使析构函数为虚一般是个坏主意。因为它会为类增加一个虚函数表,使得对象的体积翻倍,还有可能降低其可移植性。所以基本的一条是:无故的声明虚析构函数和永远不去声明一样是错误的。实际上,很多人这样总结:当且仅当类里包...原创 2019-11-18 09:41:03 · 175 阅读 · 0 评论 -
c++ 多继承及其二义性
内容来源: 传智播客上面继承关系中,b1类与b2类同时继承自b类,c类继承自b1类与b2类。所以当调用b类时,c++编译器不知道b类成员变量等到底是来源于b1还是b2类,会导致二义性,引起失败。#include<iostream>using namespace std;class B {public: int b=3; void print1() { c...原创 2019-11-17 20:19:55 · 154 阅读 · 0 评论 -
继承与组合混搭情况下, 构造与析构的调用规则
原则:先构造父类, 再构造成员变量,最后构造自己。先析构自己,再析构成员变量,最后析构父类。#include<iostream>using namespace std;class TestClass1{public: TestClass1() { cout << "A"; } ~TestClass1() { cout <<...原创 2019-11-17 17:42:07 · 149 阅读 · 0 评论 -
c++ 继承中的构造与析构
问题: 如何初始化父类成员? 父类与子类的构造函数的关系? 在子类对象构造时, 需要调用父类构造函数对其继承得来的成员进行初始化。 在子类对象析构时,需要调用父类析构函数对其继承得来的成员进行清理。继承中的构造与析构调用规则 1. 子类对象在创建时会首先调用父类的构造函数 2. 父类构造函数执行结束后,执行子类的构造函数 3. 当父类构造函数具有参数时...原创 2019-11-17 16:39:58 · 209 阅读 · 0 评论 -
c++ 类型兼容性原则
内容源自: 传智播客类型兼容性规则是指在需要基类对象的任何地方,都可以使用公有派生类的对象来替代。通过公有继承,派生类得到了基类中除构造函数、析构函数之外的所有成员。这样,公有派生类实际就具备了基类的所有功能,凡是基类能够解决的问题,公有派生类都可以解决。类型兼容性原则包含下面几种情况:1. 子类对象可以当做父类对象使用。2. 子类对象可以直接赋值给父类对象3, 子类对象可以直...原创 2019-11-17 15:57:52 · 1141 阅读 · 0 评论 -
c++ 运算符重载实现数组案例
#include<iostream>using namespace std;class Array {public: Array(int m_length); //构造函数 Array(const Array& obj); //拷贝构造函数 ~Array(); //析构函数 int length(); //求取数组长度 //a1[i] = i 需要重载[]操作...原创 2019-11-17 10:40:42 · 1179 阅读 · 0 评论 -
c++ 重载 输出流操作符
在C++中, 重载 << 只能使用全局函数,下面代码是具体实现。#include<iostream>using namespace std;class Complex {private: int a; int b;// friend void operator<<(ostream& out, Complex& c1); fri...原创 2019-11-16 20:20:02 · 222 阅读 · 0 评论 -
c++ 重载前置++ 与 前置--
#include<iostream>using namespace std;// 重载前置++ 前置-- 运算符class Complex {private: int a; int b; friend Complex& operator++(Complex& c1);public: Complex(int a, int b) { this-&g...原创 2019-11-16 16:59:23 · 431 阅读 · 0 评论 -
c++ 运算符重载的基本概念理解
为什么需要 运算符重载?当我们简单将两个整数相加时,c++编译器知道究竟该怎么做,但是当我们将两个复数类进行相加时,c++编译器并不知道该怎么做,此时就需要操作符重载。操作符重载函数形式一般分为两种:1. 全局函数(友元函数)2. 成员函数下面代码计算了两个复数对象之间相加与相减。 其中 + 运算符重载通过 友元函数 实现, - 运算符重载通过成员函数实现。#inc...原创 2019-11-16 16:19:42 · 259 阅读 · 0 评论 -
c++ 友元函数
c++中的友元函数作用是破坏了类的封装性,在类的内部的成员函数中,可对类的私有属性进行访问与修改,但是在类的外部,如果属性是private, 就无法对其进行修改。但是, 友元函数能够破坏类的封装性,在全局函数中, 能够对类的私有数据变量进行访问。要想使用友元函数,必须要在类中进行友元函数的声明,声明的位置不加限定,可以在public区域,也可以在private区域。下面代码是利用友元函...原创 2019-11-16 15:06:11 · 221 阅读 · 0 评论