
C++
C++
du1232
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 32 - III. 从上到下打印二叉树 III
题目请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]]思路:1栈1队列,k是每一层的标识数在奇数层,进行正常的层序遍历进入队列的同时,并入栈 。如:队列[1,2] 栈原创 2021-06-21 11:25:59 · 154 阅读 · 0 评论 -
Leetcode--692-前K个高频单词
题目给一非空的单词列表,返回前 k 个出现次数最多的单词。返回的答案应该按单词出现频率由高到低排序。如果不同的单词有相同出现频率,按字母顺序排序。示例 1:输入: ["i", "love", "leetcode", "i", "love", "coding"], k = 2输出: ["i", "love"]解析: "i" 和 "love" 为出现次数最多的两个单词,均为2次。 注意,按字母顺序 "i" 在 "love" 之前。思路:map联合vector。map中的key是唯原创 2021-06-08 17:38:45 · 131 阅读 · 0 评论 -
LeetCode(106、144、94)二叉树前序、中序、后序遍历的非递归写法
前序class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> v; stack<TreeNode*> st; TreeNode* cur = root; while(!st.empty()||cur) { while(cu原创 2021-06-06 20:16:13 · 128 阅读 · 0 评论 -
LeetCode--剑指 Offer 30包含min函数的栈
class MinStack {public: /** initialize your data structure here. */ stack<int> m_data; stack<int> m_min; MinStack() {} //思路:两个栈,一个正常压数据,一个只压最小数据 //m_min每次压数据时候都要判断是否比当前栈顶数据小 //如果小直接压,如果大,将自身的栈顶数据再压一次 void push(i原创 2021-05-26 23:04:59 · 84 阅读 · 0 评论 -
Leetcode--剑指offer09--用两个栈实现队列
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )class CQueue {public: stack<int>stack1; stack<int>stack2; CQueue() {} //尾部插入使用一个栈 void appendTail(int value)原创 2021-05-26 23:03:01 · 90 阅读 · 0 评论 -
leetcode--剑指offer-28,对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ 2 2/ \ / 3 4 4 3输出 : true思路:迭代的思想使用迭代思想做题最重要的是,确定迭代结束的条件。包括迭代成功结束的条件和迭代到一半失败结束的条件!此题中,我们从左右两子树父节点开始迭代,迭代条件有三个! if(left == nullptr && right == nullptr原创 2021-05-10 17:43:48 · 94 阅读 · 0 评论 -
Leetcode---236. 二叉树的最近公共祖先
题目:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”示例 1:输入:root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出:3解释:节点 5 和节点 1 的最近公共祖先是节点 3 。思路:递归的思想,递归的结束条件是root == p || roo原创 2021-05-07 10:59:37 · 152 阅读 · 0 评论 -
C++ list 模拟实现
#pragma oncenamespace dk{/////////////////////////////////////节点类 template <class T> struct __list_node//struct默认访问权限是共有的 { T _data; __list_node<T>* _next; __list_node<T>* _prev; __list_node(const T& x = T()) :_data原创 2021-04-23 18:25:06 · 162 阅读 · 1 评论 -
C++vector模拟实现
vector.h#pragma once#include<assert.h>#include<iostream>namespace dk{ template<class T> class vector { public: //迭代器 typedef T* iterator; typedef const T* const_iterator; iterator begin() { return _start; } i原创 2021-04-23 18:20:41 · 128 阅读 · 0 评论 -
深入理解C++ 中深浅拷贝+string类+实现一个string类+string类的现代写法
深浅拷贝浅拷贝浅拷贝:也称位拷贝,编译器只是将对象中的值拷贝过来。如果对象中管理资源,最后就会导致多个对象共享同一份资源,当一个对象销毁时就会将该资源释放掉,而此时另一些对象不知道该资源已经被释放,以为还有效,所以 当继续对资源进项操作时,就会发生发生了访问违规。要解决浅拷贝问题,C++中引入了深拷贝。说明:上述string类没有显式定义其拷贝构造函数与赋值运算符重载,此时编译器会合成默认的,当用s1构造s2时,编译器会调用默认的拷贝构造。最终导致的问题是,s1、s2共用同一块内存空间,在释放时同一原创 2021-04-18 16:48:47 · 187 阅读 · 0 评论 -
Leetcode--字符串相加 C++实现
题目: 415. 字符串相加题目描述:给定两个字符串形式的非负整数 num1 和num2 ,计算它们的和。思路:使用数值相加减的思路,从后向前按位相加设置一个进位next相加后的每一位进行尾插最后对字符串进行逆置,得到结果class Solution {public: string addStrings(string num1, string num2) { string ret;//定义一个string类 int end1 = num1.s原创 2021-04-05 19:02:25 · 369 阅读 · 0 评论 -
C/C++内存管理
int globalVar = 1;static int staticGlobalVar = 1;void Test(){static int staticVar = 1;int localVar = 1;int num1[10] = {1, 2, 3, 4};char char2[] = "abcd";char* pChar3 = "abcd";int* ptr1 = (int*)malloc(sizeof (int)*4);int* ptr2 = (int*)calloc(4, si原创 2021-03-24 16:15:47 · 94 阅读 · 0 评论 -
Linux 进程(fork 、僵尸进程,孤儿进程)系统调用和库函数的概念
文章目录1.进程1.1描述进程-PCB1.2 task_struct-PCB的一种1.3task_ struct内容分类1.4查看进程1.5通过系统调用获取进程标识符1.6通过系统调用创建进程-fork初识1、如何理解进程创建?2、fork为什么会有两个返回值?如何深刻的理解呢?3、fork父子执行顺序和代码和数据复制的问题-初识2.进程状态2.1Z(zombie)-僵尸进程2.1.1僵尸进程危害:2.2孤儿进程补充用户态和内核态系统调用和库函数概念1.进程课本概念:程序的一个执行实例,正在执行的程序等原创 2021-03-24 16:01:57 · 192 阅读 · 0 评论 -
C++ 初始化列表+static成员+友元函数+友元类
1. 初始化列表初始化列表:以一个冒号开始,接着是一个以逗号分隔的数据成员列表,每个"成员变量"后面跟一个放在括号中的初始值或表达式。class Time{public: Time(int hour)//这里的构造函数不能被调用 //1.因为没有传参,需要调用的是无参的构造函数 //2.因为没有传参,如果Time(int hour = 1),有默认值,就可调用 :_hour(hour) { cout << "Time(int hour)" << endl原创 2021-03-23 20:55:02 · 211 阅读 · 0 评论 -
函数的返回值使用传引用返回还是传值返回
最近学习到运算符重载,关于函数使用传引用返回还是传值返回的理解一直有些模糊,决定在此小总结一下!引用的概念:引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。引用的特性:int main(){ int a = 10; int &b = a;//b是a的别名,通过ab都可以修改a的值 a = 20; b = 30; int &c = a;//1.可以有多个别名 int &d = b; //原创 2021-03-23 20:53:00 · 747 阅读 · 3 评论 -
C++之日期类的实现之 默认成员函数和运算符重载的综合应用(+、-、=、<、>、+=、-=)
在完成日期类时,涉及到对应月份天数的限制,先构造出下面的函数,用以判断当月天数。//获取某一月的天数int Date::GetMonthDay(int year, int month){ static int daysArray[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; int days = daysArray[month]; if (month == 2 && ((year % 4 == 0 &am原创 2021-03-11 18:17:22 · 134 阅读 · 0 评论 -
类和对象中 构造函数+析构函数+拷贝构造函数+操作符重载
文章目录1. 类的6个默认成员函数2. 构造函数构造函数特征3. 析构函数析构函数特征4. 拷贝构造函数拷贝构造函数特征5. 赋值操作符重载运算符重载赋值运算符重载1. 类的6个默认成员函数如果一个类中什么成员都没有,简称为空类。空类中什么都没有吗?并不是的,任何一个类在我们不写的情况下,都会自动生成下面6个默认成员函数.2. 构造函数构造函数是一个特殊的成员函数,名字与类名相同,创建类类型对象时由编译器自动调用,保证每个数据成员都有 一个合适的初始值,并且在对象的生命周期内只调用一次。构造函数原创 2021-03-11 18:05:12 · 284 阅读 · 0 评论 -
类和对象入门(上)定义+实例+结构体内存对齐+this指针
1.面向过程和面向对象的初步认识C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。2.类的引入C语言中,结构体中只能定义变量,在C++中,结构体内不仅可以定义变量,也可以定义函数。class className{// 类体:由成员函数和成员变量组成}; // 一定要注意后面的分号3.类的定义class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注原创 2021-03-06 17:02:01 · 174 阅读 · 0 评论 -
C++入门之--命名空间+缺省函数+函数重载+引用+内联函数
1、命名空间在C/C++中,变量、函数和后面要学到的类都是大量存在的,这些变量、函数和类的名称将都存在于全局作用域中,可能会导致很多冲突。使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突或名字污染,namespace关键字的出现就是针对这种问题的。1.1命名空间的定义定义命名空间,需要使用到namespace关键字,后面跟命名空间的名字,然后接一对{}即可,{}中即为命名空间的成员。//1. 普通的命名空间namespace N1 // N1为命名空间的名称{ // 命名空间中的内原创 2021-02-26 00:31:47 · 173 阅读 · 0 评论