自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(62)
  • 问答 (1)
  • 收藏
  • 关注

原创 c++__多态

多态性(polymorphism)可以简单地概括为“一个接口,多种方法”,它是面向对象编程领域的核心概念。 多态性指相同对象收到不同消息或不同对象收到相同消息时产生不同的实现动作。C++支持两种多态性:编译时多态性,运行时多态性。 编译时多态性(静态多态):通过重载函数实现:先期联编 early binding 运行时多态性(动态多态):通过虚函数实现 :滞后联编 late binding C++运行时多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(Overri

2020-06-28 20:39:27 303

原创 c++ __继承

1.继承概念 (在代码中,在原有类的基础上<属性和方法>,构造一个新的类。) 继承需要符合的关系:is-a的关系;父类更通用更抽象,子类更特殊更具体(因为父类相对于子类而言,父类中有的方法,子类全都有;而子类有的属性和方法父类未必有,所以子 类更具体,父类更抽象)。继承背后的思想就是基于已经存在的类来构建新类,当从已存在的类继承时,就重用了它的方法和属性,还可以添加新的方法和属性来定制新类以应对需求 (新类称之为子类,被扩建的类称之为父类)。在java当中,除了Object类之外,所有的类

2020-06-28 20:20:52 337 1

原创 priority_queue 模拟实现

namespace bit { //函数对象 less template struct less { bool operator()(const T& left, const T& right) { return left < right; } }; //函数对象 greater template struct greater { bool operator()(const T& left, const T& right) { return l

2020-06-23 19:34:51 244

原创 stack和queue 模拟实现

/* *思路: stack和queue的模拟实现思路一样,都是通过容器适配而成 容器的模板参数Con给出容器deque作为底层的默认容器(使用的过程中也可以自己指定容器) stack和queue的方式实现在底层都是转为调用适配容器,只要容器能够满足所有的转调用操作,都可以充当适配 容器 由于stack和queue是通过其他容器适配而成,所以stack和queue称为容器适配器 */ namespace bit { #include<deque>

2020-06-23 19:34:18 272

原创 栈的弹出压入序列

输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) class Solution { public: bool IsPopOrder(vector<int> pushV, vector<int> popV) { //入栈和出栈

2020-06-23 19:33:04 119

原创 模拟实现list类

namespace bite { // List的节点类 template struct ListNode { ListNode(const T& val = T()): _pPre(nullptr), _pNext(nullptr), _val(val) {} ListNode<T>* _pPre; ListNode<T>* _pNext; T _val; }; //List的迭代器类 template<class T, class Ref, class P

2020-06-23 19:28:26 155

原创 _vector的特性及使用

vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间的目的. 用法: 1.文件包含: 首先在程序开头处加上#include<vector>以包含所需要的类文件vector 还有一定要加上using namespace std; 2.变量声明: 2.1 例:声明一个int向量以替代一维的数组

2020-06-23 19:23:47 760

原创 数组中出现次数超过一半的数字

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 /* *思路: 数组排序后,如果符合条件的数存在,则一定是数组中间那个数 (比如:1,2,2,2,3;或2,2,2,3,4;或2,3,4,4,4等等) 查找满足条件的数 count > len/2,则出现次数大于一半 */ class Solution { public:

2020-06-23 19:18:22 127

原创 连续子数组的最大和

HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) /* *思路: 1、基于数组本身特性 2、当前元素大于连续子数组和加

2020-06-23 19:16:27 123

原创 模拟实现string类

模拟实现string类 namespace bit { class string { friend ostream& operator<<(ostream& _cout, const bit::string& s); friend istream& operator>>(istream& _cin, bit::string& s); public: typedef char* iterator; public: string(co

2020-06-23 19:14:01 185

原创 变量所在哪个内存区域以及变量所占空间大小是多少?

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*)ca

2020-06-23 18:59:56 739

原创 累加天数

设计一个程序能计算一个日期加上若干天后是什么日期。 输入描述: 输入第一行表示样例个数m,接下来m行每行四个整数分别表示年月日和累加的天数。 输出描述: 输出m行,每行按yyyy-mm-dd的个数输出。 示例1 输入 复制 1 2008 2 3 100 输出 复制 2008-05-13 #include<iostream> using namespace std; int main() { int n; while(cin>>n)

2020-06-02 17:04:40 281

原创 日期类的实现

class Date { public: // 获取某年某月的天数 int GetMonthDay(int year, int month) { static int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; int day = days[month]; if (month == 2 &&((year % 4 == 0 && year % 100 != 0) || (ye

2020-06-02 17:02:28 140

原创 二叉树的实现

二叉树的实现** // 通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树 BTNode BinaryTreeCreate(BTDataType* a, int n, int* pi); // 二叉树销毁 void BinaryTreeDestory(BTNode** root); // 二叉树节点个数 int BinaryTreeSize(BTNode* root); // 二叉...

2020-04-27 18:57:24 153

原创 判断一颗二叉树是否是平衡二叉树

判断一颗二叉树是否是平衡二叉树 / 解题思路: 首先要保证当前树的左右子树高度差不大于1,并且子树本身也是平衡树。* / int maxDepth(struct TreeNode root){ return root ? 1 + fmax(maxDepth(root->left) , maxDepth(root->right)) : 0; } bool isBalanced(struc...

2020-04-27 18:55:01 168

原创 二叉树的构建及遍历

二叉树的构建及遍历 /* *解题思路: 在先序遍历的过程中构建每一个节点 / #include <stdio.h> #include <malloc.h> typedef struct BTNode { char _data; struct BTNode* _left; struct BTNode* _right; }BTNode; //中序遍历 void Inorder(...

2020-04-27 18:52:30 157

原创 .单值二叉树

.单值二叉树 / 解题思路: 遍历二叉树,并且每一个节点值都和根节点的值进行比对,如果不等于根节点的值,则不是单值树。 / bool _isUnivalTree(struct TreeNode* root, int val){ if(root == NULL) return true; if(root->val != val) return false; return _isUnivalTr...

2020-04-27 18:50:15 208

原创 二叉树最大深度

二叉树最大深度 /* 解题思路: 二叉树的最大深度等价于:左右子树的最大深度 + 1 / int maxDepth(struct TreeNode root){ if(root == NULL) { return 0; } size_t left = maxDepth(root->left) + 1; size_t right = maxDepth(root->right) + 1; ...

2020-04-27 18:49:43 195

原创 翻转二叉树

翻转二叉树 /* 解题思路: 翻转每一棵树的左右子树根节点 / void _invertTree(struct TreeNode root){ if(root){ struct TreeNode* tmp = root->left; root->left = root->right; root->right = tmp; _invertTree(root->left)...

2020-04-27 18:49:08 189

原创 检查两颗树是否相同

检查两颗树是否相同 /* 解题思路: 首先比较根节点是否相同,然后分别比较左右子树是否相同。 / bool isSameTree(struct TreeNode p, struct TreeNode* q){ if(p == NULL && q != NULL) return false; if(p != NULL && q == NULL) return fals...

2020-04-27 18:48:30 231

原创 对称二叉树

对称二叉树 /* 解题思路: 判断一个树是否对称,首先要判断左右孩子是否对称相等,还需要判断左孩子的左子树是否和右孩子的右子树对称,左孩子的右子树是否和右孩子的左子树对称。 / bool _isSymmetric(struct TreeNode left, struct TreeNode* right) { if(left == NULL && right == NULL) ret...

2020-04-27 18:47:54 105

原创 二叉树的前序遍历

二叉树的前序遍历 /* 解题思路: 此题要保存节点,所以需要先获取节点个数,然后进行前序遍历,保存每一个节点值。 / //节点个数 = 左右子树节点个数 + 1 int BSize(struct TreeNode root) { if(root == NULL) return 0; return BSize(root->left) + BSize(root->right) + 1; }...

2020-04-27 18:47:20 149

原创 二叉树中序遍历

二叉树中序遍历 /* 解题思路,遍历时进行中序遍历 / int BSize(struct TreeNode root) { if(root == NULL) return 0; return BSize(root->left) + BSize(root->right) + 1; } void _InOrder(struct TreeNode* root, int* a, int* pi...

2020-04-27 18:46:47 184

原创 二叉树的后序遍历

二叉树的后序遍历 /* 解题思路,遍历时进行后序遍历 / int BSize(struct TreeNode root) { if(root == NULL) return 0; return BSize(root->left) + BSize(root->right) + 1; } void _postorderTraversal(struct TreeNode* root, int...

2020-04-27 18:46:08 107

原创 另一颗树的子树

.另一颗树的子树 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。 解题思路: 判断t是否为s的子树,需要判断t是否和s的某一个子树相同,所以此题就是判断两棵树是否相同的逻辑。 / bool isSameTree(struct TreeNode p, struct ...

2020-04-27 18:45:05 103

原创 双链表的增删查改

双链表的增删查改 #include "List.h" ListNode* BuyListNode(LTDataType x) { ListNode* node = (ListNode*)malloc(sizeof(ListNode)); node->data = x; node->next = NULL; node->prev = NULL; return node...

2020-04-07 18:09:13 147

原创 对链表进行插入排序

对链表进行插入排序 /* 解题思路: 此题可以先创建一个排序空链表,对于每一个节点找到它在排序链表中的合适位置,然后进入插入操作 */ typedef struct ListNode Node; struct ListNode* insertionSortList(struct ListNode* head){ if(head == NULL || head->next == NULL)...

2020-04-07 18:08:21 197

原创 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针

在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针 /* 解题思路: 此题可以先找出相同节点的区间,然后删除区间中的所有值,直到把链表遍历完结束 */ class Solution { public: ListNode* deleteDuplication(ListNode* pHead) { if(pHead == NU...

2020-04-07 18:07:39 450

原创 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝

给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。要求返回这个链表的深度拷贝 /* 解题思路: 此题可以分三步进行: 1.拷贝链表的每一个节点,拷贝的节点先链接到被拷贝节点的后面 2.复制随机指针的链接:拷贝节点的随机指针指向被拷贝节点随机指针的下一个位置 3.拆解链表,把拷贝的链表从原链表中拆解出来 */ class Solution { public: ...

2020-04-07 18:02:22 392

原创 给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 NULL /* 解题思路: 如果链表存在环,则fast和slow会在环内相遇,定义相遇点到入口点的距离为X,定义环的长度为C,定义头到入口的距离为L,fast在slow进入环之后一圈内追上slow,则会得知: slow所走的步数为:L + X fast所走的步数为:L + X + N * C 并且fast所走的步数为slow的两倍...

2020-04-07 18:01:48 474

原创 给定一个链表,判断链表中是否有环

给定一个链表,判断链表中是否有环 /* 解题思路: 定义快慢指针fast,slow, 如果链表确实有环,fast指针一定会在环内追上slow指针。 */ typedef struct ListNode Node; bool hasCycle(struct ListNode *head) { Node* slow = head; Node* fast = head; while(f...

2020-04-07 18:01:11 417

原创 输入两个链表,找出它们的第一个公共结点

输入两个链表,找出它们的第一个公共结点 /* 解题思路: 此题可以先计算出两个链表的长度,让长的链表先走相差的长度,然后两个链表同时走,直到遇到相同的节点,即为第一个公共节点 */ struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) { int lenA = 0, lenB...

2020-04-07 18:00:35 324

原创 链表的回文结构

链表的回文结构 /* 解题思路: 此题可以先找到中间节点,然后把后半部分逆置,最近前后两部分一一比对,如果节点的值全部相同,则即为回文。 */ class PalindromeList { public: bool chkPalindrome(ListNode* A) { if (A == NULL || A->next == NULL) return true; ListN...

2020-04-07 18:00:01 136

原创 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前

编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 /* 解题思路 创建两个链表,分别存放小于x的节点和大于等于x的节点,分别进行尾插 */ class Partition { public: ListNode* partition(ListNode* pHead, int x) { if(pHead == NULL) ...

2020-04-07 17:59:06 802

原创 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的 /* 解题思路: 此题可以先创建一个空链表,然后依次从两个有序链表中选取最小的进行尾插操作进行合并。 */ typedef struct ListNode Node; struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l...

2020-04-07 17:58:18 743

原创 输入一个链表,输出该链表中倒数第k个结点

/* 解题思路: 快慢指针法 fast, slow, 首先让fast先走k步,然后fast,slow同时走,fast走到末尾时,slow走到倒数第k个节点。 */ class Solution { public: ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) { struct ListNode* s...

2020-04-02 12:15:21 102

原创 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点

/* 解题思路: 通过快慢指针找到中间节点,快指针每次走两步,慢指针每次走一步,当快指针走到结尾的时候,慢指针正好走到中间位置 */ typedef struct ListNode Node; struct ListNode* middleNode(struct ListNode* head){ Node* slow = head; Node* fast = head; ...

2020-04-02 12:14:49 633

原创 反转一个单链表

/* 解题思路: 此题一般常用的方法有两种,三指针翻转法和头插法 三指针翻转法 记录连续的三个节点,原地修改节点指向 头插法 每一个节点都进行头插 */ // 三个指针翻转的思想完成逆置 struct ListNode* reverseList(struct ListNode* head) { if(head == NULL || head->next == NULL) ...

2020-04-02 12:14:01 133

原创 删除链表中等于给定值 val 的所有节点

/* 解题思路:从头节点开始进行元素删除,每删除一个元素,需要重新链接节点 */ struct ListNode* removeElements(struct ListNode* head, int val) { if(head == NULL) return NULL; struct ListNode* cur = head; struct Li...

2020-04-02 12:13:24 347

原创 合并两个有序数组

/* 解题思路:从最大值开始合并,所以合并从两个数组的末尾元素开始合并,依次把最大的元素放到末尾即可。 */ void merge(int* nums1, int nums1Size, int m, int* nums2, int nums2Size, int n){ //end1:nums1的末尾 //end2:nums2的末尾 //end:合并之后整个数组的末尾 ...

2020-04-02 12:12:22 128

空空如也

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

TA关注的人

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