自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

bqw的博客

没什么描述

  • 博客(30)
  • 资源 (2)
  • 收藏
  • 关注

原创 【设计模式】策略模式

参考来源:http://www.runoob.com/design-pattern/strategy-pattern.html 介绍 策略模式定义了算法簇,并将这些算法封装起来,并在运行时可以使这些算法相互替换。 作用 在有多种算法相似的情况下,使用if…else会带来复杂和难以维护,这时使用策略模式将这些算法封装成一个一个的类。由于这些类实现了同一接口,因此在运行时可以相关替...

2019-03-30 15:13:20 139

原创 进程与线程的区别和联系

定义进程:具有一定独立功能的程序关于某个数据集合上的一次运行活动,或者说进程就是一段程序的执行过程;线程:是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但同一个进程的线程共享进程的资源;区别调度:进程是拥有资源的基本单位,线程是调度和分派的基本单位;地址空间:进程拥有独立的地址空间,隔...

2019-03-19 03:49:14 195

原创 【C++】:继承、虚函数、多态

继承 继承允许依据一个类来定义另一个类,这样可以提供代码重用率等。下面是一个Rectangle继承Shape类的例子://基类class Shape{protected: int width; int height;public: void setWidth(int w){ width = w; } void setHeight(int h){ height...

2019-03-17 22:05:17 474

原创 【C++】:内存管理

内存分配方式 C++内存分为5个区,分别是堆、栈、全局/静态存储区、常量存储区和程序代码区。堆:动态内存分配(new/delete,malloc/free),内存不连续且会产生碎片;栈:局部变量、函数参数等存储在该区,由编译器自动分配和释放;全局/静态存储区:全局变量和静态变量存储在该区;常量区:存储常量;程序代码区:存放程序的二进制代码; 堆和栈的区别 空间...

2019-03-17 13:00:59 154

原创 【C++】:智能指针

一、 智能指针的作用C++11引入了智能指针的概念。。在使用普通指针,容易造成内存泄露或者多次释放,因此为了更好的管理内存引入智能指针。二、 智能指针的使用智能指针包含在头文件中,包括shared_ptr、unique_ptr、weak_ptr。1. shared_ptr1.1 介绍shared_ptr是一种智能指针,作用如同指针,但会记录有多少shared_ptr共同指向一个对象,这...

2019-03-17 03:45:46 172

原创 《剑指offer》学习笔记_面试题49_丑数

题目描述 我们把只包含因子2、3和5的数称作丑数。求按小到大的顺序的第1500个丑数。习惯上我们把1当作第一个丑数。 思路 我们希望创建一个丑数的数组,数组里是排好序的丑数。由于丑数的定义,那么每个丑数均是前面丑数乘以2、3或者5得到的。为了获得下一个丑数,我们希望能够获得三个丑数记为t2,t3和t5。其中t2表示该丑数乘以2刚好大于当前丑数,而t2之前的丑数乘以2小于当前的丑数...

2019-03-16 12:26:08 238

原创 《剑指offer》学习笔记_面试题38_字符串的排列

题目描述 输入一个字符串,打印出该字符串中字符的所有排列。 思路 一个字符串可以分成两部分看,一部分是第1个字符,另一个部分是后面所有的字符。先固定第1个字符,然后将后面所有字符的所有排列与第1个字符组合。之后再将其他位置的字符与第1个字符交换,然后再将后面所有字符的所有排列与第1个字符组合。 C++实现 class Solution {public: ve...

2019-03-15 00:01:29 189

原创 《剑指offer》学习笔记_面试题17_打印1到最大的n位数

题目描述 输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数999。 思路 方法一由于可能会有溢出,因此需要使用字符串来模拟整数加法,因此需要实现一个对整数字符串加1的函数。方法二将该问题看做是0~9十个字符的全排列问题,然后用递归的方式实现。 C++实现 方法一void Increment(string&...

2019-03-14 20:09:29 199

原创 《剑指offer》学习笔记_面试题14_剪绳子

题目描述 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]*k[1]*...*k[m]可能的最大乘积是多少。(绳子只能在整数的位置剪) 思路 设f(i)表示长度为i的绳子的可能最大乘积,那么f(n)=max{f(i)*f(n-i)},i=1,2,…,n。 C++实现 int maxProduc...

2019-03-14 17:15:56 216

原创 《剑指offer》学习笔记_面试题47_礼物的最大价值

题目描述 在一个m*n的棋盘的每一格都放有一个礼物,每个礼物都有一定的价值(价值大于0)。你可以从棋盘的左上角开始拿格子里的礼物,并每次向左或向下移动一格,直到到达棋盘的右下角。给定一个棋盘及其上面的礼物,请计算你最多能拿到多少价值的礼物? 思路 动态规划。设函数f(i,j)表示到达坐标(i,j)的格子时能拿到的礼物总和的最大值,那么到达(i,j)只能通过格子(i-1,j)或者(...

2019-03-14 12:25:09 182

原创 《剑指offer》学习笔记_面试题48_最长不含重复字符的子字符串

题目描述 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 思路 动态规划。设f(i)表示以第i个字符为结尾的不包含重复字符的子字符串的最长长度。那么当第i个字符之前没有出现过,显然f(i)=f(i-1)+1;当第i个字符出现过,但是两次出现的间隔大于f(i-1),这样前面出现的字符并不影响f(i)的值,因此f(i)=f(i-1)+1;当第i个字...

2019-03-13 20:42:41 214

原创 《剑指offer》学习笔记_面试题50(二)_字符流中第一个只出现一次的字符

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 思路 一个字符占8位,故字符不会超过256个,所以用一个大小为256的数组记录每个字符的出现次数。然后依次扫描原始字符串中的字符,遇到第1个出现次数为1的字符...

2019-03-13 18:57:33 450

原创 《剑指offer》学习笔记_面试题41_数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。 思路 维护一个最大堆和一个最小堆,其中最大堆中的所有数均小于最大堆中的数。并其维持两个堆...

2019-03-13 16:37:38 224

原创 《剑指offer》学习笔记_面试题45_把数组排成最小的数

题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如,输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323. 思路 贪心。假设数组中只有两个数字m和n,那么我们只需要比较mn和nm。如果mn<nm,则打印出mn,也就是m应该排在n前面;否则打印nm,n排在m前面;这样我们就定义了一种比较规则,可以...

2019-03-13 15:14:36 208

原创 《剑指offer》学习笔记_面试题50(一)_第一个只出现一次的字符

题目描述 在字符串中找出第一个只出现一次的字符。如输入”abaccdeff”,则输出’b’。 思路 使用hash表统计各个字符的出现次数。然后从头扫描字符串,当遇到第一个只出现一次的字符,则返回。 C++实现 class Solution {public: int FirstNotRepeatingChar(string str) { uno...

2019-03-13 02:17:28 158

原创 《剑指offer》学习笔记_面试题18(二)_删除链表中重复的节点

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5。 思路 递归。先判断队首元素是否重复,如果重复的话,将重复的元素全部删除,然后递归的调用删除之后节点中的重复元素。 C++实现 class...

2019-03-13 02:07:45 183

原创 《剑指offer》学习笔记_面试题18(一)_删除链表的节点

题目描述 给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间内删除该结点。 思路 为了在O(1)时间内实现删除节点,那么可以将该节点后一个节点的值拷贝到该结点,然后直接删除该节点的后一个节点即可。 C++实现 void deleteNode(ListNode* node){ if(node==NULL)return; Lis...

2019-03-13 01:36:15 204

原创 《剑指offer》学习笔记_面试题10_斐波那契数列_跳台阶

一、斐波那契数列 题目描述 写一个函数,输入n,求斐波那契数列的第n项。其中斐波那契数列的定义如下: 思路 显然,斐波那契数列已经给出了递推的方程。通常,有了递推方程后,那么即可以用分治,也可以用动态规划。假设,我们要计算f(5)=f(4)+f(3)=f(3)+f(2)+f(3)=…,显然在计算f(5)的是否要重复的计算两次f(3)。所以如果用分治的话,就会有很多重复计...

2019-03-13 01:17:20 239

原创 《剑指offer》学习笔记_面试题6_从尾到头打印链表

题目描述 输入一个链表的头结点,从尾到头反过来打印出每个节点的值。 思路 递归。 C++实现 class Solution {public: vector<int> res; vector<int> printListFromTailToHead(ListNode* head) { if(head==NULL)...

2019-03-13 00:54:13 244

原创 《剑指offer》学习笔记_面试题59_队列的最大值

题目描述 给定一个数组num和滑动窗口的大小size,请找出所有滑动窗口里的最大值。 思路 我们用一个双向队列来模拟滑动窗口,但是我们并不把所有窗口中的数字都保存在双向队列里,而是只保留那些可能是最大值的数字。在初始往双向队列中插入数字时,先插入第1个数字。当插入第2个数字时,如果大于第1个数字,那么第1个数字就不可能成为滑动窗口的最大值,因此将第1个数字弹出。如果小于第1个...

2019-03-13 00:46:55 354

原创 《剑指offer》学习笔记_面试题58(二)_左旋转字符串

题目描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。 思路 假设给定一个长度为n的矩阵,然左旋转k个字符。先反转整个句子,然后旋转右边的k个和左边的n-k个字符。 C++实现 class Solution {public: string Le...

2019-03-12 22:39:57 321

原创 《剑指offer》学习笔记_面试题58(一)_翻转字符串

题目描述 输入一个英文,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样的处理。例如输入字符串“I am a student.”,则输出“student. a am I”。 思路 方法一先翻转整个句子,再翻转句子内的单词。例如先翻转整个句子“.tneduts a ma I”,反翻转内部的逐个单词“student. a ma I”。方法二...

2019-03-12 22:18:03 306

原创 《剑指offer》学习笔记_面试题57(二)_和为s的连续正数序列

题目描述 输入一个正数是,打印出所有和为s的连续正数序列。 思路 初始时,使用低、高两个游标分别指向1和2;如果两个游标的和大于s,那么右移低游标,如果两个游标的和小于s,那么右移高游标。如何恰好等于s,将序列加入的结果中,并右移低游标,开始寻找新的满足需求的序列。 C++实现 class Solution {public: vector<vector...

2019-03-11 22:56:30 240

原创 《剑指offer》学习笔记_面试题57(一)_和为s的数字

题目描述 输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。 思路 使用两个游标分别指向数组的首位,首尾元素的和作为当前的和。如果该和大于s,将尾部的游标减一;如果该和小于s,将首部的游标加一。 C++实现 class Solution {public: vector<int&g...

2019-03-11 22:43:36 185

原创 《剑指offer》学习笔记_面试题55(二)_平衡二叉树

题目描述输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。思路后序遍历二叉树,先分别统计左右子树的深度,再判断树是否平衡。C++实现class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { retur...

2019-03-11 22:34:46 209

原创 《剑指offer》学习笔记_面试题55(一)_二叉树的深度

题目描述 输入一棵二叉树的根节点,求该树的深度。 思路 分治。树的深度等于左右子树中的最大深度加一。 C++实现 class Solution {public: int TreeDepth(TreeNode* pRoot) { if(pRoot==NULL)return 0; int left = TreeDepth(...

2019-03-11 22:20:39 228

原创 《剑指offer》学习笔记_面试题53_数字在排序数组中出现的次数

题目描述 统计一个数字在排序数组总出现的次数。 思路 最直观的方法就是顺序扫描,时间复杂度为O(n)。可以使用二分查找,分别找出排序数组中第一个该数的下标和最后一个该数的下标,然后就可得到数字的出现次数。而二分查找的时间复杂度为O(logn)。 C++实现 class Solution {public: int GetNumberOfK(vector<...

2019-03-11 22:13:40 186

原创 《剑指offer》学习笔记_面试题52_两个链表的第一个公共节点

题目描述 输入两个链表,找出它们的第一个公共节点。 思路 方法一如果两个链表有公共节点,那么公共节点出现在两个链表的尾部。如果从两个链表的尾部开始向前比较,那么最后一个相同的节点就是我们要找的节点。为了从后向前比较链表,我们可以将链表分别压入两个栈中,然后比较栈顶元素是否相同。如果相同则弹出,如果不同,那么上一个弹出的节点就是我们要找的节点。方法二分别统计两个链表的长...

2019-03-11 21:12:04 175

原创 《剑指offer》学习笔记_面试题51_数组中的逆序对

题目描述在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出,即输出P%1000000007。思路将数组中分为两个数组,分别为左数组与右数组。如果可以统计出左数组的逆序数leftCount和右数组的逆序数rightCount。那么如果可以再统计出逆序对的两个数字分别在左右数组...

2019-03-11 20:35:37 195

原创 《剑指offer》学习笔记_面试题8_二叉树的下一个节点

题目描述 给定一棵二叉树和其中的一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左、右孩子节点的指针,还有一个指向父节点的指针。 思路 若该结点有右孩子结点,那么中序遍历中的下一个结点就是其右子树最左边的结点; 若该结点没有右孩子结点 若该结点是其父结点的左孩子,那么中序遍历中的下一个结点就是其父结点; 若该结点...

2019-03-11 18:30:33 218

basic-miktex-2.9.6643-x64.exe

MikTeX是Tex/LaTex最新的实现程序,使用Anaconda将文档保存成PDF时需要安装。

2018-04-04

Linux下模拟软件互斥实现算法

在Linux下,模拟实现四种软件互斥算法:Dekker,Peterson,Lamport,Eisenburg-Mcguire.

2012-09-07

空空如也

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

TA关注的人

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