自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(64)
  • 收藏
  • 关注

原创 【07_适配器模式】

生活中的适配器买笔记本电脑,买手机时,都有一个电源适配器,电源适配器又叫外置电源,是小型便携式电子设备及电子电器的供电电压变换设备,常见于手机,笔记本电脑上。它的作用是将家里的220V高电压转换成这些电子产品能工作的5V~20V左右稳定的低电压,使它们能正常工作。就是说,如果没有这个电源适配器,我们的手机和电脑就不能进行充电了。之前同事去日本出差,由于工作需要,就将自己的笔记本带过去了。到了的当晚就悲剧了,笔记本无法使用。由于日本的居民用电电压是110V,而中国是220V,同事的笔记本是220V供电的。

2022-04-30 17:57:46 309

原创 【06_原型模式】

什么是原型模式?在GOF的《设计模式:可复用面向对象软件的基础》中是这样说的:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。这这个定义中,最重要的一个词是“拷贝”,也就是口头上的复制,而这个拷贝,也就是原型模式的精髓所在。举一个最简单的例子来说明原型模式:记得上小学的时候,老师把需要做的课外习题写到黑板上,而下面的我们都要把这些题抄写到自己的本子上,回家做好,第二天交上来,也就是每道题,全班50个人,每个人都要抄写一遍。按照现在的时间理论来说,就是浪费了50个人的时间。但是,那个时候条

2022-04-30 11:43:32 274

原创 【05_建造者模式】

建造者模式在GOF的《设计模式 可复用面向对象软件的基础》中是这样说的:将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。这句话,似懂非懂的。一个复杂对象的创建,其通常是由很多的子对象构成;如果一个对象能够直接就创建好了,那么也不会称之为复杂对象。由于项目中需求的变化,这个复杂对象的各个部分经常会发生剧烈的变化,但是,不管怎么变化,将它们组合在一起,组成一个复杂的对象的事实是不会变的。建造者模式就提供了一种“封装机制”来将各个对象的变化隔离开,最终,组合成复杂对象的过程是不会变的

2022-04-30 11:41:17 293

原创 【04_抽象工厂模式】

问题描述之前讲到了C++设计模式——工厂方法模式,我们可能会想到,后期产品会越来越多了,建立的工厂也会越来越多,工厂进行了增长,工厂变的凌乱而难于管理;由于工厂方法模式创建的对象都是继承于Product的,所以工厂方法模式中,每个工厂只能创建单一种类的产品,当需要生产一种全新的产品(不继承自Product)时,发现工厂方法是心有余而力不足。举个例子来说:一个显示器电路板厂商,旗下的显示器电路板种类有非液晶的和液晶的;这个时候,厂商建造两个工厂,工厂A负责生产非液晶显示器电路板,工厂B负责生产液晶显示器电

2022-04-27 17:22:55 223

原创 【03_工厂方法模式】

问题描述之前讲到了C++设计模式——简单工厂模式,由于简单工厂模式的局限性,比如:工厂现在能生产ProductA、ProductB和ProductC三种产品了,此时,需要增加生产ProductD产品;那么,首先是不是需要在产品枚举类型中添加新的产品类型标识,然后,修改Factory类中的switch结构代码。是的,这种对代码的修改,对原有代码的改动量较大,易产生编码上的错误(虽然很简单,如果工程大了,出错也是在所难免的!!!)。这种对代码的修改是最原始,最野蛮的修改,本质上不能称之为对代码的扩展。同时,由

2022-04-27 17:20:48 206

原创 【02_简单工厂模式】c++实现

问题描述之前在公司做了一个windows 8平台的阅读器。首先,需要将电子书中的内容渲染到屏幕上,而电子书每一页都包含各种各样的内容,比如:图形、图像和文字等等;不同的内容,就是不同的对象;在将不同的内容渲染到屏幕上之前,就需要new操作,建立不同的对象,然后再在屏幕上进行描绘。这个时候,就需要进行很多new操作,new操作分布在代码的不同地方,管理起来很麻烦,而且也很乱,到后期扩展和维护的时候,有的时候,对象多的让开发人员不知道这个对象是干什么的,这就增加了难度;同时,new操作,都会有对应的异常处理,

2022-04-27 17:18:16 122

原创 【01_单例模式】c++实现单例

问题描述现在,不管开发一个多大的系统(至少我现在的部门是这样的),都会带一个日志功能;在实际开发过程中,会专门有一个日志模块,负责写日志,由于在系统的任何地方,我们都有可能要调用日志模块中的函数,进行写日志。那么,如何构造一个日志模块的实例呢?难道,每次new一个日志模块实例,写完日志,再delete,不要告诉我你是这么干的。在C++中,可以构造一个日志模块的全局变量,那么在任何地方就都可以用了,是的,不错。但是,我所在的开发部门的C++编码规范是参照Google的编码规范的。全局变量在项目中是能不用就

2022-04-25 13:47:46 533

原创 【多线程】c语言中的多线程

线程 Thread:专业术语称之为程序执行流的最小单元 。线程是不会执行程序的,可以理解成线程就是一个载体,将 要执行的代码 运送到CPU进行处理。多线程就是多个线程同时并发执行。1. 为什么用多线程?1). 避免拥塞单个线程中的程序,是按照顺序执行的,排在前面的程序如果发生异常卡住(阻塞),会影响到后面的程序执行。多线程就等于是异步调用,避免这个情况。2) .避免CPU的空转这个比如一个网页,如果是单线程的话,服务器处理一条请求后,会等待下一个请求,这时候CPU处于一个闲置的状态。多线程能避免

2022-04-24 17:29:45 20841 2

原创 【多线程例子】c语言写一个多线程案例

第一个多线程程序#include <stdio.h>#include <pthread.h>//定义线程要执行的函数,arg 为接收线程传递过来的数据void *Thread1(void *arg){ printf("http://c.biancheng.net\n"); return "Thread1成功执行";}//定义线程要执行的函数,arg 为接收线程传递过来的数据void* Thread2(void* arg){ printf("C

2022-04-20 14:53:26 6856

转载 【二叉树的创建】c++实现二叉树的创建

参考:1、数据结构图文解析之:树的简介及二叉排序树C++模板实现.2、C语言创建二叉树过程中遇到的一些问题二叉树的创建:树节点的结构://二叉树的节点的结构struct TreeNode{ char value=0; //结束符'\0' TreeNode* left=NULL; TreeNode* right=NULL;};递归创建二叉树(先序)://传递节点指针的指针!!!重要void CreateTree(TreeNode*& everyTreeNode){

2022-04-19 17:16:06 5614 4

原创 【二叉搜索树】c++实现二叉搜索树

二叉搜索树的定义:二叉树中每一个节点:若其左子树存在,则其左子树中每个节点的值都小于该节点值,若其右子树存在,则其右子树中每个节点的值都大于该节点值。没有键值相等的节点。如果想了解更多二叉搜索树的定义:数据结构(二):二叉搜索树(Binary Search Tree)二叉搜索树主要是用来查找和排序的,查找的时间复杂度o(logn) ~ o(n) ,排序只要中序遍历一遍就可以得到有序的序列。代码:#include <iostream>using namespace

2022-04-15 17:11:52 2236

原创 [栈]c++实现栈操作

#pragma once#include <iostream>using namespace std;class CStack{public: CStack(int size) { max_Size = size; data = new int(max_Size); top = -1; } ~CStack() { delete data; } //是否为空 bool isEmpty(); //是否满栈 bool isFull();.

2022-04-13 16:38:29 599

转载 【队列】c++使用数组实现队列

数组队列基本概念 代码实现 1 数组队列的类 2 判断队列是否满 3 判断队列是否为空 4 向队列中添加元素 5 从队列中取出元素 6 获取队列元素个数 7 显示队列所有元素 8 显示队列头元素 9 数组队列全部代码 10 测试代码 结果与分析 1 操作结果 2 分析与待改进 基本概念队列是一个有序列表,可以用数组或是链表来实现。 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入的要后取出 使用数组来实现队列的示意图 .

2022-04-11 16:01:37 3935 2

原创 【链表】c++实现链表的各种操作

C++实现单链表(含完整代码)使用C++实现单链表的基本操作1、创建单链表2、获取单链表的长度3、获取单链表index位置的元素值4、单链表index位置插入val5、删除单链表index位置的元素6、删除链表中值val的节点7、打印单链表8、销毁链表完整代码:#include <iostream>using namespace std;//定义表结点的数据结构:数据 + 指针struct ListNode { int val; ListNode*

2022-04-11 14:53:08 2331

原创 【()】c++实现函数调用运算符重载

函数调用运算符 () 也可以重载 由于重载后使用的方式非常像函数的调用,因此称为仿函数 仿函数没有固定写法,非常灵活class MyPrint{public: void operator()(string text) { cout << text << endl; }};void test01(){ //重载的()操作符 也称为仿函数 MyPrint myFunc; myFunc("hello world");}class MyAdd{

2022-04-08 17:27:13 801

原创 【==】c++实现关系运算符重载

作用:重载关系运算符,可以让两个自定义类型对象进行对比操作class Person{public: Person(string name, int age) { this->m_Name = name; this->m_Age = age; }; bool operator==(Person & p) { if (this->m_Name == p.m_Name && this->m_Age == p.m_Age) {

2022-04-08 17:25:46 876

原创 [=]c++实现赋值运算符重载

c++编译器至少给一个类添加4个函数默认构造函数(无参,函数体为空) 默认析构函数(无参,函数体为空) 默认拷贝构造函数,对属性进行值拷贝 赋值运算符 operator=, 对属性进行值拷贝如果类中有属性指向堆区,做赋值操作时也会出现深浅拷贝问题示例:class Person{public: Person(int age) { //将年龄数据开辟到堆区 m_Age = new int(age); } //重载赋值运算符 Person& operato

2022-04-08 17:23:35 488

原创 【++运算符重载】c++实现递增运算符重载

作用: 通过重载递增运算符,实现自己的整型数据class MyInteger { friend ostream& operator<<(ostream& out, MyInteger myint);public: MyInteger() { m_Num = 0; } //前置++ MyInteger& operator++() { //先++ m_Num++; //再返回 return *this; } //后置++ M

2022-04-07 19:10:12 407

原创 【<<运算符重载】c++实现左移运算符重载

作用:可以输出自定义数据类型class Person { friend ostream& operator<<(ostream& out, Person& p);public: Person(int a, int b) { this->m_A = a; this->m_B = b; } //成员函数 实现不了 p << cout 不是我们想要的效果 //void operator<<(Person&a

2022-04-07 18:54:08 376

原创 [+运算符重载]c++实现加号运算符重载

作用:实现两个自定义数据类型相加的运算class Person {public: Person() {}; Person(int a, int b) { this->m_A = a; this->m_B = b; } //成员函数实现 + 号运算符重载 Person operator+(const Person& p) { Person temp; temp.m_A = this->m_A + p.m_A; temp.m_B = this-.

2022-04-07 18:41:37 875

原创 【计数排序】c++实现计数排序

计数排序:计数排序不是基于比较的排序算法,其核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。 作为一种线性时间复杂度的排序O(n),计数排序要求输入的数据必须是有确定范围的整数。(直方图统计,再按照顺序扔出来)动图演示:程序代码:#include <iostream>#include <vector>using namesapce std;void countingSort(vector<int>& arr, int max

2022-04-01 18:55:52 1196

原创 【归并排序】c++实现归并排序

归并排序基本思想:归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为2-路归并。平均时间复杂度:最坏时间复杂度:最好时间复杂度:空间复杂度:稳定性:稳定程序代码:#include<iostream>using namespace std; void merge(i.

2022-04-01 18:34:27 978

原创 【希尔排序】c++实现希尔排序

希尔排序基本思想:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,具体算法描述:选择一个增量序列t1,t2,…,tk,其中ti>tj,tk=1;按增量序列个数k,对序列进行k 趟排序;每趟排序,根据对应的增量ti,将待排序列分割成若干长度为m 的子序列,分别对各子表进行直接插入排序。仅增量因子为1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。程序代码:#include<iostream>using namespace std; void print

2022-04-01 10:13:05 1277

原创 【插入排序】c++实现插入排序

插入排序的基本思想:从第二个元素开始,找到元素的正确位置并插入,直到最后一个元素,则完成排序。就像扑克牌,每拿一张扑克牌都将其插入到正确的位置,拿完所有扑克牌后其为有序状态。最坏时间复杂度:平均时间复杂度:最好时间复杂度:空间复杂度:稳定性:稳定程序代码:#include<iostream>using namespace std; void print(int a[], int n){ for(int j= 0; j<n; j++) {

2022-04-01 10:06:34 195

原创 【冒泡排序】c++实现冒泡排序

冒泡排序的基本思想:比较相邻的元素,如果反序则交换。通过第一趟排序能找出最大的元素,并使最大的元素移至最后一位,然后通过第二次排序使次大的元素移至倒数第二位,以此类推,直至所有元素有序。程序代码:...

2022-04-01 10:02:24 204

原创 【选择排序】c++实现选择排序

选择排序(Selection-sort):是一种简单直观的排序算法。它的工作原理:选择前面n-1个数中的最大值,和当前队尾数据交换,因为要交换最大值,所以要记录最大值位置的索引。首先在未排序序列中找到最大元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最大元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。程序代码:#include<iostream>using namespace std; void print(int a[], int n){

2022-04-01 10:00:43 4537

原创 【快速排序】c++实现快速排序

快速排序:的基本思想是:通过一次排序将要排序的数据分成两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,直到有序。程序代码:#include<iostream>using namespace std; void print(int a[], int n){ for(int j= 0; j<n; j++) { cout<<a[j] <<" ";

2022-04-01 09:57:29 629

原创 【堆排序】c++实现堆排序

堆排序:堆排序的基本思想是:将待排序序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序序列。程序代码:#include <iostream>#include <vector>using namespace std; //辅助交换函数void Swap(int &a, int &b){ int

2022-04-01 09:54:06 750

原创 “跳台阶扩展问题”

描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶(n为正整数)总共有多少种跳法。数据范围:1≤n≤20进阶:空间复杂度O(1), 时间复杂度O(1)示例1输入:3返回值:4示例2输入:1返回值:1思路一:循环class Solution {public: int jumpFloorII(int number) { if(number < 2) return 1; ...

2022-02-11 11:17:41 339

原创 “连续子数组的最大和”

描述输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。数据范围:1<=n<=2×10^5−100<=a[i]<=100要求:时间复杂度为 O(n),空间复杂度为 O(n)进阶:时间复杂度为 O(n),空间复杂度为 O(1)示例1输入:[1,-2,3,10,-4,7,2,-5]返回值:18说明:经分析可知,输入数组的子数组[3,10,-4,7,2]可以求得最大和为18

2022-02-11 10:40:50 80

原创 c++之多态性,什么是多态?如何实现?

目录多态的概念概念多态的定义及实现多态的构成条件虚函数虚函数的重写虚函数重写的两个例外:C++11 override 和 final重载、覆盖(重写)、隐藏(重定义)的对比抽象类概念接口继承和实现继承多态的原理虚函数表多态的原理​动态绑定与静态绑定单继承和多继承关系的虚函数表单继承中的虚函数表多继承中的虚函数表 多态的概念 概念 多态的概念:通俗来说,就是多种形态,具体点就是去完成某个行为,当不同的对象去完成.

2022-01-14 09:31:28 6459 2

原创 “数据流中的中位数”

描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。数据范围:数据流中数个数满足 1 <= n <= 1000,大小满足进阶: 空间复杂度, 时间复杂度示例1输入:[5,2,3,4,1,6,7,0,8]返回值:"5.00 3.5...

2022-01-13 10:28:18 226

原创 “字符串的排列”

描述输入一个长度为 n 字符串,打印出该字符串中字符的所有排列,你可以以任意顺序返回这个字符串数组。例如输入字符串ABC,则输出由字符A,B,C所能排列出来的所有字符串ABC,ACB,BAC,BCA,CBA和CAB。数据范围:n < 10n<10要求:空间复杂度O(n!)O(n!),时间复杂度O(n!)O(n!)输入描述:输入一个字符串,长度不超过10,字符只包括大小写字母。示例1输入:"ab"返回值:["ab","ba"]说明:返回["ba","..

2022-01-09 09:18:45 441

原创 “翻转单词序列”

描述牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“nowcoder. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a nowcoder.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?数据范围:1 <= n <= 100进阶:空间复杂度 O(n),时间复杂度O(n),保证没有只包含空格的字符串..

2022-01-08 09:43:46 99

原创 “滑动窗口的最大值”

描述给定一个长度为 n 的数组 num 和滑动窗口的大小 size ,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6

2022-01-08 09:17:23 238

原创 c语言中三块难啃的硬骨头

目录一.指针1.复杂类型说明2.细说指针3.指针的类型4.指针所指向的类型5.指针的值6.指针本身所占据的内存区二.函数三.结构体、递归1. 结构体有何作用2. 结构体成员变量内存对齐C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块“难啃的硬骨头”几乎是公认级别的。一.指针指针公认最难理解的概念,也是让很多初学者选择放弃的直接原因。指针之所以难理解,因为指针本身就是一个变量,是一个非常特殊的变量,专门存放地.

2022-01-06 10:01:40 377 1

原创 “二叉树中和为某一值的路径”

描述给定一个二叉树root和一个整数值 sum ,求该树有多少路径的的节点值之和等于 sum 。1.该题路径定义不需要从根节点开始,也不需要在叶子节点结束,但是一定是从父亲节点往下到孩子节点2.总节点数目为n3.保证最后返回的路径个数在整形范围内(即路径个数小于231-1)数据范围:0<=n<=1000-10^9<=节点值<=10^9假如二叉树root为{1,2,3,4,5,4,3,#,#,-1},sum=6,那么总共如下所示,有3条路径符合要求

2022-01-06 09:48:18 77

原创 “二叉树的下一个节点”

描述给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。下图为一棵有9个节点的二叉树。树中从父节点指向子节点的指针用实线表示,从子节点指向父节点的用虚线表示示例:输入:{8,6,10,5,7,9,11},8返回:9解析:这个组装传入的子树根节点,其实就是整颗树,中序遍历{5,6,7,8,9,10,11},根节点8的下一个节点就是9,应该返回{9,10,11},后台只打印子树的下一个节点,所以只会打

2022-01-04 10:40:04 103

原创 “二叉搜索树与双向链表”

描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。如下图所示数据范围:输入二叉树的节点数0≤n≤1000,二叉树中每个节点的值0≤val≤1000要求:空间复杂度O(1)(即在原树上操作),时间复杂度O(n)注意:1.要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继2.返回链表中的第一个节点的指针3.函数返回的TreeNode,有左右指针,其实可以看成一个双向链表的数据结构4...

2022-01-03 20:31:54 93

原创 “二叉树中和为某一值得路径(二)”

描述输入一颗二叉树的根节点root和一个整数expectNumber,找出二叉树中结点值的和为expectNumber的所有路径。1.该题路径定义为从树的根结点开始往下一直到叶子结点所经过的结点2.叶子节点是指没有子节点的节点3.路径只能从父节点到子节点,不能从子节点到父节点4.总节点数目为n如二叉树root为{10,5,12,4,7},expectNumber为22则合法路径有[[10,5,7],[10,12]]数据范围:树中节点总数在范围 [0, 5000] 内

2022-01-03 00:00:00 78

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除