- 博客(108)
- 收藏
- 关注
原创 【设计模式】单例模式
总结一下单例模式便于自己之后的复习1.懒汉模式【版本1:线程不安全】class Singleton{ private: Singleton(){} static Singleton* instance; public: int a; static Singleton* getInstance();};Sin...
2019-08-01 22:43:31 118
转载 线程数究竟设多少合理
转自:架构师之路公众号推文一、需求缘起Web-Server通常有个配置,最大工作线程数,后端服务一般也有个配置,工作线程池的线程数量,这个线程数的配置不同的业务架构师有不同的经验值,有些业务设置为CPU核数的2倍,有些业务设置为CPU核数的8倍,有些业务设置为CPU核数的32倍。“工作线程数”的设置依据是什么,到底设置为多少能够最大化CPU性能,是本文要讨论的问题。二、一些共性认知在进行...
2019-07-15 11:44:21 171
转载 C++ 智能指针详解
转自:C++ 智能指针详解一、简介由于 C++ 语言没有自动内存回收机制,程序员每次 new 出来的内存都要手动 delete。程序员忘记 delete,流程太复杂,最终导致没有 delete,异常导致程序过早退出,没有执行 delete 的情况并不罕见。用智能指针便可以有效缓解这类问题,本文主要讲解参见的智能指针的用法。包括:std::auto_ptr、boost::scoped_ptr、...
2019-05-14 14:30:53 141
转载 数的机器码表示:原码,反码,补码
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助!一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是...
2019-05-01 20:09:27 3115 1
转载 约瑟夫问题
约瑟夫问题约瑟夫问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。首先A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数接着轮到A报数,他报2。也被杀死了。最终胜利者是C解决方案普通解法刚学数据结构的时候,我们可能用链表的方法去模拟这个过程,N个人看作是N个链表节点,节点1指
2021-10-07 18:29:16 1635
原创 买卖股票
#include<bits/stdc++.h>using namespace std;const int maxn = 1e3+5;double a[maxn];int main(){ int n; cin>>n; if(n == 0) return 0; for(int i = 0; i < n; ++i){ cin>>a[...
2019-09-16 20:19:42 296
原创 【LeetCode 572】另一个树的子树
区分树的子结构【不能序列化】、树的子树【可以序列化】我刚开始的时候只注意了序列化的时候把节点后加特殊符号分开,却忽略了根节点处的问题比如母树只有根节点12,子树只有一个节点2。如果不处理根节点则序列化后s1:12_#_#_s2:2_#_#_明明应该是输出false却变成了true所以要在根节点前加一个特殊符号做出节点分割,保证每个节点前后都独立,就可以通过~/** * Defin...
2019-09-05 23:54:27 256
原创 【LeetCode 236】二叉树的最近公共祖先
Code递归的去遍历左右子树是否包含要查找的节点/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), rig...
2019-09-03 13:19:40 156
原创 【LeetCode 235】二叉搜索树的最近公共祖先
Code利用BST的特性,某一个节点的值必定比其左子树的值大,比其右子树的值小所以比较当前节点的值和给定的两个节点值大小,若都大于则到左子树寻找,否则去右子树寻找。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNo...
2019-09-03 09:30:15 152
原创 【剑指Offer】不用加减乘除做加法
1.题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。2.Code借用位运算class Solution {public: int Add(int a, int b) { int tmp; while(b){ tmp = a^b; b = (a&b)&...
2019-08-28 01:27:12 138
原创 【剑指Offer】求1+2+3+...+n
1.题目求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。2.Code前n项和公式:n*(n+1)/2 = (n^2 + n )/ 2class Solution {public: int Sum_Solution(int n) { return (int)(pow(n,2)+...
2019-08-28 00:50:25 105
转载 【设计模式】单例模式2
如果多线程下同时进入if(!onlystance)就有可能出现错误。所以显然是需要加入互斥锁的。class singleStance{ private : singleStance(); public : static singleStance* onlystance; static singleStance* getStance(){ lockBase* lockbase...
2019-08-19 15:58:54 101
原创 C++基本编程质量规范试题笔记——来自林锐博士《高质量编程指南》测试题
一、请填写 BOOL , float, 指针变量 与“零值”比较的 if 语句。(10 分)提示:这里“零值”可以是 0, 0.0 , FALSE 或者“空指针”。例如 int 变量 n 与“零值” 比较的 if 语句为: if ( n == 0 ) if ( n != 0 ) 以此类推。请写出 BOOL flag 与“零值”比较的 if 语句:if(!flag)if(flag)...
2019-08-12 17:09:15 513
原创 【剑指Offer】数组中出现次数超过一半的数字
1.题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。2.Code...
2019-08-11 21:03:24 133
原创 【剑指Offer】调整数组顺序使奇数位于偶数前面
1.题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。2.Code注意:牛客上的这道题要比剑指上面的多了一个限制条件:保证奇偶的各自的相对位置不发生变化,这就意味着:不借助额外空间是不可能做到的。剑指上的没有限制相对位置,所以只要保证奇数都在前面,偶数都在后面,原地调就...
2019-08-09 08:11:12 127
原创 【剑指Offer】旋转数组的最小数字
1.题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。2.Code二分:具体看代码很好理解。注意一点,当arr[left]、arr[right]、arr[mid]都...
2019-08-08 23:14:40 113
原创 【剑指Offer】二维数组中的查找
1.题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。2.Code是一个有序的数组,从左到右,从上到下升序,选取右上角或者左下角则可以每次依据判断大小剪掉一部分。当然也可以2层循环遍历一遍二维数组。class Solution {public...
2019-08-08 22:20:24 124
原创 C++ template 模板笔记记录
C++ template 模板笔记记录模板实例化:模板的定义本身不参与编译,而是编译器根据模板的用户使用模板时提供的类型参数生成代码,再进行编译,这一过程称为模板实例化一、 函数模板1.定义:就是把处理不同类型的公共逻辑抽象成函数,就得到了函数模板template<typename T>T cmp(const T& a, const T& b){ retu...
2019-08-08 10:48:26 278
原创 【剑指Offer】二叉搜索树的第k个结点
1.题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。2.Code二叉搜索树的中序遍历就是有序序列,定义一个计数器count每次中序遍历的时候+1,当等于k的时候结束/*struct TreeNode { int val; struct TreeNode *left; str...
2019-08-07 22:27:05 199
原创 【剑指Offer】序列化二叉树
1.题目请实现两个函数,分别用来序列化和反序列化二叉树2.Code用特定的符号将各个节点独立出来,最后按照这个顺序重建二叉树即可,注意一些边界条件。class Solution {public: string Tree_to_string(TreeNode* root){ if(!root){ return "#"; ...
2019-08-06 23:42:19 108
原创 【剑指Offer】把二叉树打印成多行
1.题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。2.Code(1)解法1:继承上1个题的思路这个题和“之”字形打印的思路一样的,只不过是顺序都保持了一致(先进先出),则可以将stack换做queue/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *r...
2019-08-06 21:57:59 293
原创 【剑指Offer】按之字形顺序打印二叉树
1.题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。2.Code按照“之”打印,就是成语“顶针续麻”或蛇头咬蛇尾的那种意思(例子不是很恰当,为了便于理解而已)~~~用下面这棵树举例,结果就是[1,3,2,4,5,6,7,15,14,13,12,11,10,9,8]牛客的测试是将每一层都放到...
2019-08-05 22:16:59 120
原创 【剑指Offer】对称的二叉树
1.题目:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。2.Code如果是/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x):val(x), left(NULL...
2019-08-05 21:12:43 96
原创 【剑指Offer】二叉树的下一个结点
1.题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。2.Code中序遍历:左子树、根、右子树中序遍历的结果:4,2,8,5,9,1,6,3,7观察图片可以知道:节点2的下一节点是8,即右子树的最左节点节点9的下一节点是1,这个就比较麻烦了,它没有右子树,则只能通过指向父结点的指针回溯,同时判断是不...
2019-08-04 17:46:22 87
原创 【剑指Offer】平衡二叉树
1.题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。2.Code一棵平衡二叉树就是这棵树中的以任何一个节点为根节点的树,其左右子树的高度差不超过1。所以上一个题求一棵二叉树的深度的方法就可以借鉴了啊。既然可以递归求取子树的高度,那么就可以比比二者的高度差,然后判断即可/*struct TreeNode { int val; struct TreeNode *left;...
2019-08-04 12:19:41 99
原创 【剑指Offer】二叉树的深度
1.题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。2.Code题意说:树的深度就是从根节点到最深的一个叶子节点的深度。比如只有根节点则深度就是1,则可以使用递归去判断左右子树一直到各自的最后一个叶子节点,然后取最大值再加上根节点的1即可/*struct TreeNode { int val; ...
2019-08-04 12:06:07 106
原创 【剑指Offer】二叉搜索树的后序遍历序列
1.题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。2.Code后序遍历数组,则最后一个数是树的根节点,又因为是一棵BST,则比这个数小的都是左子树,比其大的都是个右子树上的节点。所以递归解决即可。注意数组为空的状态和边界条件的检查class Solution {public: bo...
2019-08-02 08:29:45 90
转载 c++中字符串反转的3种方法
1.使用cstring头文件中的strrev函数#include <iostream>#include <cstring>using namespace std; int main(){ char s[]="hello"; strrev(s); cout<<s<<endl; return 0;}2.使用...
2019-08-01 23:39:23 1481
转载 Volatile关键字
Volatile关键字1.编译器的优化(1)硬件上:由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问。另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度(2)软件上:①程序员优化②编译器自身的优化:编译器优化常用的方法有:将内存变量缓存到寄存器;调整指...
2019-08-01 15:55:39 86
原创 【剑指Offer】二叉搜索树与双向链表
1.题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。2.解析方法1:递归给定的是一棵BST,中序遍历的结果就是一个有序序列,所以只要将给定的节点递归的连接到链表的尾部,一定要处理好左右指针和最后将指针回溯到头节点才可以返回双向链表Code/*struct TreeNode { int val; s...
2019-07-28 19:00:43 111
原创 【剑指Offer】二叉树中和为某一值的路径
1.题目:输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)2.解析:要求输出所有的路径和情况,所以返回的结果是一个vector<vector<int>>,既然是从根节点打印到叶子节点,相当于先序遍历每个节点,(结束的...
2019-07-28 16:51:09 112
原创 【剑指Offer】二叉树的镜像
1.题目操作给定的二叉树,将其变换为源二叉树的镜像。2.解析所谓镜像,即和原来的树左右对称利用三变量交换法来交换左右子树即可从根节点开始交换,然后判断其左右子树是否存在,存在就递归调用贴个图便于理解Code/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *righ...
2019-07-28 10:59:43 124
原创 【剑指Offer】链表中环的入口结点
1.题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。2.Code之前写过这个题目的题解及证明,链接在这:链表环入口/*struct ListNode { int val; struct ListNode *next; ListNode(int x):val(x), next(NULL) { }};*/class Sol...
2019-07-28 10:25:48 110
原创 【剑指Offer】复杂链表的复制
1.题目2.解法:(1)直接复制:先处理普通指针,再处理随机指针时间复杂度:O(n^2),额外空间复杂度:O(1)因为在确定clone链表的每个节点的random指针的时候都需要从头去遍历原链表Code/*struct RandomListNode { int label; struct RandomListNode *next, *random; Rand...
2019-07-28 02:24:21 120
原创 【剑指Offer】从上往下打印二叉树
1.题目从上往下打印出二叉树的每个节点,同层节点从左至右打印。2.Code要求层序打印 ,就是广搜BFS,借助一个队列,题目要求返回的是一个vector数组,则将队列中弹出的元素push_back到数组中即可注意:一定要判断root为空的特殊样例,我开始的时候忽略了这个边界,导致了段错误/*struct TreeNode { int val; struct TreeNode *le...
2019-07-25 15:36:36 116
原创 【剑指Offer】从尾到头打印链表
1. 题目输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。2. Code将节点的值保存到栈stack中,最后从栈中弹出再保存到vector中递归的解法如果层数太多的时候会爆栈/** * struct ListNode { * int val; * struct ListNode *next; * ListNode(in...
2019-07-25 08:17:09 83
原创 【剑指Offer】树的子结构
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)解法:(1)树的遍历递归的到母树上面匹配子树的结构,存在即true,否则是false。第1步:比较根节点,如果根节点的值不相同,则必然是false。第2步:去遍历左子树和右子树注意:边界条件,如果子树为空的时候递归结束。同时要注意检验非法输入:pRoot1 = NULLCod...
2019-07-24 00:56:56 190
原创 【剑指Offer】重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。code解析:递归法求取树的root节点由于给定前序和中序,或者后序和中序就可以确定一棵二叉树的结构所以:先序情况下第一个节点必然是树的根节...
2019-07-22 23:07:21 102
原创 【LeetCode 203】移除链表元素
题目:删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5笔记解析刷题就TMD是个踩坑的过程,闪一下子却很舒服,因为会有成长~坑点:(1)注意有多个要删除的节点链接 解法:将三种类别分开讨论,只要是cur->...
2019-07-18 23:41:02 172
原创 【LeetCode 160】相交链表
题目:编写一个程序,找到两个单链表相交的起始节点。链接:https://leetcode-cn.com/problems/intersection-of-two-linked-lists/Code:既然是相交的链表则说明必然最后一个节点的地址是相同的。所以先遍历一遍判断尾节点是否一致,最后看哪个链表长,就让其指针先走多出来的长度,然后一起走,地址相同的时候就是相交节点/** ...
2019-07-18 22:58:24 97
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人