剑指offer
文章平均质量分 66
yuhan_9204
这个作者很懒,什么都没留下…
展开
-
剑指offer 53-正则表达式匹配
题目:请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符'.'表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”及“ab*a”均不匹配。 分析:如果模式中的字符ch是‘.’,那么它可以匹配字符串中的任意字符。如果模式中的字原创 2015-06-28 17:12:35 · 349 阅读 · 0 评论 -
剑指offer 63 - 二叉搜索树的第K个节点
中序遍历遍历即可#include#includeusing namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight; }; BinaryTreeNode* CreateBina原创 2015-06-07 19:15:48 · 311 阅读 · 0 评论 -
剑指offer 45-约瑟夫环
方法1:list 循环方法2: 公式法方法3:链表#include#includeusing namespace std;//方法1int LastRemaining(unsigned int n,int m){ if(n<1 || m<-1) return 0; list numbers; for(int i=0;i<n;i++) numbers.push_b原创 2015-06-26 20:57:25 · 395 阅读 · 0 评论 -
(重要)剑指offer 46-求1+2+..N
题目:求1+2..+N,要求不能使用乘除法、for/while/if/else/switch/case等关键字及条件判断语句(A?B:C)方法1: 利用构造函数,static ,构造n个实例。方法2:利用虚函数求解。当n不为0时,调用函数Base::Sum() ,当n为0时,调用函数Derived::Sum()方法3:利用函数指针求解。类似虚函数方法4:利用模板类型求解#inc原创 2015-06-26 22:09:01 · 278 阅读 · 0 评论 -
剑指offer 43-n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。首先解决前提性的问题:一个骰子的点数只可能是[1,6],所以S的值的取值范围是[n,6n],这里当然只考虑整数。 统计各个S值出现的次数,然后 各个S值出现的概率 = 各个S值出现的次数 / n个骰子所有点数的排列数 其中,n个骰子所有点数的排列数等于6n原创 2015-06-26 14:31:10 · 376 阅读 · 0 评论 -
剑指offer 47-不用加减乘除做加法 交换
加法:异或 相与#includeusing namespace std;//加法int Sum(int a,int b){ int sum,carry; do { sum = a^b; carry = a&b; a = sum; b = carry; }while(b!=0); return a;}//交换void Swap(int &a,in原创 2015-06-26 22:22:51 · 276 阅读 · 0 评论 -
剑指offer 60 - 把二叉树打印成多行
题目: 按层打印二叉树,每一层打印到一行。86 105 7 9 11类似于面试题23,用一个队列保存将要打印的节点,为了将二叉树的每一行打印一行里,我们需要两个变量,一个变量表示在当前层中还没有打印的节点数,另一个变量表示下一层节点的数目。变量toBePrinted表示在当前层中还有没有打印的节点数,而变量nextLevel比欧式下一层的节点数。如果一个节原创 2015-06-05 15:16:54 · 350 阅读 · 0 评论 -
剑指offer 61 - 按之字形打印二叉树
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶数原创 2015-06-05 16:17:19 · 286 阅读 · 0 评论 -
剑指offer 44-扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2-10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。 分析:把大小王定义为0,可以替换任意数字。 首先把数组排序,再统计数组中0的个数,最后统计排序之后的数组中相邻数字之间的空缺总数。 如果空缺的总数小于或等于0的个数,那么这个数组就是连续的;反之则不连续原创 2015-06-26 16:19:44 · 274 阅读 · 0 评论 -
剑指offer 41 - 和为s的两个数字VS为s的连续正数序列
题目:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。思路整理一下:最初我们找到数组的第一个数字和最后一个数字。首先定义两个指针,第一个指针指向数组的第一个(也就是最小的)数字,第二个指针指向数组的最后一个(也就是最大的)原创 2015-06-25 20:27:39 · 608 阅读 · 0 评论 -
剑指offer 40-数组中只出现一次的数字
1.题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字通过这道题感觉位运算很强大~这道题利用异或的几个性质:任何数与其本身异或值都为0,异或运算满足交换律。因此将一组数依次异或,若里面只有一个只出现一次的数,其他的数都出现两次,则最后的结果必然是那个只出现一次的数。要找到两个数字就可以先通过异或整个数组,将得到的结果分组。然后依次安组异或就可以得到原创 2015-06-25 19:32:07 · 289 阅读 · 0 评论 -
剑指offer 4- 替换空格
1.C/C++ 中每个字符串都以字符‘\0’ 作为结尾。string s="a";cout char * c1 = "a";coutchar c2[] = "a";cout //结果全部为12.当几个指针赋给相同的常量字符串时,它们实际上会指向相同的内存地址。但用常量内存初始化数组,情况却有所不同。char * c1 = "a"原创 2015-05-07 16:58:40 · 282 阅读 · 0 评论 -
剑指offer 58 - 二叉树的下一个节点
题目:给定一棵二叉树和其中的一个节点,如何找出中序遍历顺序的下一个节点?树中的节点除了有两个分别指向左右子节点的指针以外,还有一个指向父节点的指针 // 1// / \ // 2 3// / \ / \ //原创 2015-06-04 16:36:35 · 318 阅读 · 0 评论 -
剑指offer 59 - 对称的二叉树
题目:判断一棵二叉树是否是对称的// 8 8 7// 6 6 6 9 7 7// 5 7 7 5 5 7 5 7 7 7 7 针对前序遍历定义一种对称原创 2015-06-04 17:26:23 · 333 阅读 · 0 评论 -
剑指offer 48-不能被继承的类
//方法1 把函数构造设为私有函数class sealedClass{public: static sealedClass* GetInstance() { return new sealedClass(); } static void deleteInstance(sealedClass* pInstance) { delete pInstance; }private原创 2015-06-27 09:41:36 · 304 阅读 · 0 评论 -
static
1、什么是static? static 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性。2、为什么要引入static? 函数内部定义的变量,在程序执行到它的定义处时,编译器为它在栈上分配空间,大家知道,函数在栈上分配的空间在此函数执行结束时会释放掉,这样就产生了一个问题: 如果想将函数中此变量的值保存至下一次调用时,如何实现?原创 2015-06-27 10:06:49 · 393 阅读 · 0 评论 -
剑指offer 67-机器人的运动范围
回溯法#includeusing namespace std;int GetDigitSum(int num){ int s=0; while(num) { s += num%10; num = num/10; } return s;}int movingCountCore(int threshold,int rows,int cols,int row,i原创 2015-06-28 11:45:15 · 402 阅读 · 0 评论 -
剑指offer 10- 二进制中1的个数
#includeusing namespace std;#includeint numberOf1_1(int n) //输入负数, 程序无限循环出错{ int count =0; while(n) { if(n&1) count++; n = n >>1; } return count;}int numberOf1_2(int n) //二进制有32位,原创 2015-06-11 11:18:59 · 293 阅读 · 0 评论 -
剑指offer 12 -打印1到最大的n位数
注意点:(1)n很大,溢出,采用字符串表示数 (2)如何判断每一次增加1后是不是到了最大的n位数#includeusing namespace std;// 方法1bool Increment(char *number){ int nTakeOver =0; int nLength=strlen(number); for(int原创 2015-06-14 16:54:25 · 293 阅读 · 0 评论 -
剑指offer 14 - 调整数据顺序使奇数位于偶数前面
1.设定两个指针p1,p2: p1初始指向第一个元素,p2指向第二个元素2.p1向前直到指向偶数,p2向前直到指向奇数,若p1p2停止3.函数指针#include using namespace std;bool isEven(int n){ return (n & 1)==1; //偶数返回1}void Recorder(int *data, unsigned原创 2015-06-15 17:21:36 · 302 阅读 · 0 评论 -
剑指offer 20 - 顺时针打印矩阵
1.顺时针打印,分为几圈:columns>=start*2 && rows>=start*2) 2.每一圈读取时,第一步由左到右,第二步由上到下,第三步有右到左,第四步由下到上。后三步读取前加判断条件 #include using namespace std;void printMatrixInCircle(int **numbers,原创 2015-06-15 22:18:29 · 291 阅读 · 0 评论 -
剑指offer 11 - 数值的整数次方
注意点:(1)在求3^32时,可以先平方,然后四次,8次,16次,32次,采用递归 (2)两个小数比较是否相等 abs(result - expectedResult) (3)unsigned int 和 int (4)设置全局变量表示输入数据正确与否#include原创 2015-06-14 15:11:13 · 288 阅读 · 0 评论 -
剑指offer2 - 实现singleton模式
1. 静态构造函数静态构造函数用于初始化任何静态数据,或用于执行仅需执行一次的特定操作。在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。C#class SimpleClass{ // Static constructor static SimpleClass() { //...原创 2015-05-06 10:33:34 · 335 阅读 · 0 评论 -
剑指offer 8 - 旋转数组的最小数字
{3,4,5,1,2},比如此处被分为{3,4,5}{1,2}这样连个数组,找中间元素,让其跟元素首元素比较,如果大于首元素,则中间元素属于前半段有序数组,如果小于尾元素,那么中间元素就是后半段的元素。设定两个指针start和end分别指向数组的首尾元素,然后当start指向前半段最后一个元素,end指向后半段第一个元素,这是程序就找到了数组中的最小元素,就是end指向的那个数,程序的出口原创 2015-06-09 17:46:06 · 294 阅读 · 0 评论 -
剑指offfer 9 - FIb序列
1.三种方法: 循环 递归 公式2.一只青蛙一次可以跳上一级台阶,也可以跳上2级,球该青蛙跳上一个n级的台阶有多少种跳法 分析: 如果只有一级台阶,那显然只有一种跳法。如果有2级台阶,就有两种跳法:一次是分两次跳,一次是一级跳2级。 n级台阶时,第一次跳的时候有两种不同选择:一是第一次只跳一级,那么剩下的n-1级跳法即为f(n-1);另外一种是原创 2015-06-09 20:45:00 · 325 阅读 · 0 评论 -
剑指offer 54-表示数值的字符串
题目描述请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。123.45e+6#includeusing namespace std;void scanDigits(ch原创 2015-06-28 16:20:37 · 406 阅读 · 0 评论 -
剑指offer 64-数据流中的中位数
1.使用algorithm,最大堆最小堆 vector左边最大堆,右边最小堆,#include#include#includeusing namespace std;template class DynamicArray{public: void Insert(T num) { if(((max.size()+min.size())&1)==0) {原创 2015-06-28 10:02:16 · 277 阅读 · 0 评论 -
剑指oofer 62 - 序列化二叉树
将二叉树序列化,前序遍历,NULL指针序列化成'$'字符,及诶单之间用',' 隔开。然后根据序列化结果反序列化出二叉树。#include#includeusing namespace std;struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeN原创 2015-06-07 16:09:17 · 327 阅读 · 0 评论 -
剑指offer 55-字符流中第一个不重复的字符
与字符串中稍有不同,同样用hash表#include#includeusing namespace std;class CharStatistics{public: CharStatistics():index(0) { for(int i=0;i<256;i++) occurrence[i]=-1; } void Insert(char ch) { if原创 2015-06-28 14:47:01 · 317 阅读 · 0 评论 -
剑指offer 66-矩阵中的路径
回溯法#includeusing namespace std;bool hasPathCore(char *matrix,int rows,int cols,int row,int col,char *str,int &pathLength,bool *visited){ if(str[pathLength]=='\0') return true; bool hasPa原创 2015-06-28 11:16:02 · 300 阅读 · 0 评论 -
剑指offer 39-二叉树的深度 判断二叉树是否为平衡二叉树
方法1:得到左右子树的深度,判断方法2:存储节点深度,边遍历边判断#includeusing namespace std;struct BinaryTreeNode{ int m_nValue; BinaryTreeNode* m_pLeft; BinaryTreeNode* m_pRight;};BinaryTreeNode* CreateBinaryTreeNode原创 2015-06-25 17:09:08 · 223 阅读 · 0 评论 -
剑指offer 19 - 二叉树的镜像
先序遍历树的每个结点,若遍历到的结点有子节点,则交换它的两个结点。递归方式如果pRoot为NULL,则为空树,返回;如果pRoot不为NULL,交换pRoot左右结点,然后分别求左右子树的镜像;非递归方式步骤描述:借助栈首先,将根节点pRoot入栈;第一步:当队列未空时执行第二步;第二步:出栈交换左右节点,如果左右节点存在原创 2015-06-01 20:38:52 · 288 阅读 · 0 评论 -
剑指offer 38-数字在排序数组中出现的次数
利用二分查找的思想,分别找出第一次和最后一次出现的位置,然后相减得到出现次数#includeusing namespace std;// 找到数组中第一个k的下标。如果数组中不存在k,返回-1int GetFirstK(int *data, int length,int start ,int end ,int k){ if(start > end) return -1;原创 2015-06-24 17:20:11 · 488 阅读 · 0 评论 -
剑指offer 56-链表中环的入口点
#include using namespace std;struct ListNode{ int nValue; ListNode *nNext;};ListNode * createListNode( int a[],int length){ if(length == 0 ) return NULL; ListNode *head = NULL; L原创 2015-05-17 22:19:23 · 278 阅读 · 0 评论 -
剑指offer 26 - 复杂链表的复制
题目:有一个复杂链表,其结点除了有一个m_pNext指针指向下一个结点外,还有一个m_pSibling指向链表中的任一结点或者NULL。其结点的C++定义如下: struct ComplexNode{ int m_nValue; ComplexNode* m_pNext; ComplexNode* m_pSibling;};原创 2015-06-17 21:11:12 · 327 阅读 · 0 评论 -
剑指offer 快速排序
1.快速排序,0,1,2..n-1, 选出枢纽元index,交换a[index]与a[n-1],将小于a[n-1]的元素放在左边,大于的元素放在右边,递归分别对两组进行排序#includeusing namespace std;#includeint RandomInRange(int left,int right){ if(right>left) { srand(tim原创 2015-06-09 15:47:36 · 1204 阅读 · 0 评论 -
剑指offer 65 - 滑动窗口的最大值
使用双向队列可以满足要求,滑动窗口的最大值总是保存在队列首部,队列里面的数据总是从大到小排列。当遇到比当前滑动窗口最大值更大的值时,则将队列清空,并将新的最大值插入到队列中。如果遇到的值比当前最大值小,则直接插入到队列尾部。每次移动的时候需要判断当前的最大值是否在有效范围,如果不在,则需要将其从队列中删除。由于每个元素最多进队和出队各一次,因此该算法时间复杂度为O(N)。#include原创 2015-05-28 21:34:45 · 550 阅读 · 0 评论 -
剑指offer 22- 包含min函数的栈结构
如果想让其时间复杂都为1的话,那么就需要记录栈中的最小值,如果我们进行比较再入栈,那么push的时间复杂度就不只是1了,所以这种想法是不行的,如果我们记录一个最小值虽然能满足,但是当这个最小值被弹出之后就不能马上找到剩下元素的最小值了,所以我需要一个容器来记录每一个最小值。那么我们可以再来一个栈,这个栈中定义最小元素,如果一个数字进入1栈,那么我们就比较一下,如果这个数比2栈中的数字小就进原创 2015-05-28 19:22:53 · 299 阅读 · 0 评论 -
剑指offer 7-用两个栈实现队列
s1是入栈的,s2是出栈的。入队列:直接压入s1即可出队列:如果s2不为空,把s2中的栈顶元素直接弹出;否则,把s1的所有元素全部弹出压入s2中,再弹出s2的栈顶元素#include #includeusing namespace std;template class CQueue{public : CQueue(void); ~CQueue(void原创 2015-05-21 15:00:05 · 303 阅读 · 0 评论 -
剑指oofer 22- 栈的压入、弹出序列
题目: 输入两个整数序列。其中一个序列表示栈的push 顺序,判断另一个序列有没有可能是对应的pop 顺序。为了简单起见,我们假设push 序列的任意两个整数都是不相等的。比如输入的push 序列是1、2、3、4、5,那么4、5、3、2、1 就有可能是一个pop 系列,但序列4、3、5、1、2 就不可能是push 序列1、2、3、4、5 的pop 序列。 思路原创 2015-05-26 20:02:13 · 282 阅读 · 0 评论