剑指offer
Jack-Curry
数据挖掘 机器学习 人工智能 机器人
展开
-
剑指offer------从上往下打印二叉树
题目:思路:代码:struct TreeNode{ int val; TreeNode *left; TreeNode *right;}class Solution{public: void DeepFirstPrint(TreeNode*pTreeNode) { if(pTreeNode==NULL) return ; queue&l...原创 2018-09-30 18:23:57 · 143 阅读 · 0 评论 -
剑指offer------丑数
题目把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路所谓的一个数m是另一个数n的因子,是指n能被m整除,也就是n%m==0。根据丑数的定义,丑数只能被2、3和5整除。根据丑数的定义,丑数应该是另一个丑数乘以2、3或者5的结果(1除外)。因此我们可以创建一...原创 2018-09-27 10:39:32 · 100 阅读 · 0 评论 -
剑指offer------对称的二叉树
题目:思路:我们通常有三种不同的二叉树遍历算法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左子结点再遍历右子结点。以前序遍历为例,我们可以定义一个遍历算法,先遍历右子结点再遍历左子结点,暂且称其为前序遍历的对称遍历。遍历第一棵树,前序遍历的遍历序列为{8,6,5,7,6,7,5},其对称遍历的遍历序列为{8,6,5,7,6,7,5}。遍历第二颗树,前序遍历的...原创 2018-10-04 09:47:35 · 225 阅读 · 0 评论 -
剑指offer-----1~n整数中1出现的次数
题目:输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数。例子:例如输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。链接:剑指Offer:31思路标签:算法:寻找规律解答:1. 不考虑时间效率的解法(时间复杂度:O(nlogn))这种基本的解法就是对每一个数字进行数字的统计,时间复杂度高,难以拿到offer的解法;...原创 2018-09-26 16:11:19 · 102 阅读 · 0 评论 -
剑指offer------顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例子:如果输入如下矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.链接:剑指Offer:20题思路标签:绘图寻找规律解答:1. C++将矩阵看作若干个圈组成,每次...原创 2018-09-26 15:54:51 · 109 阅读 · 1 评论 -
剑指offer------数值的整数次方
题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。问题解析:考察代码完整性的问题。要求有异常值的处理机制。链接:剑指Offer:11题思路标签:边界值处理; 异常值处理;解答:1. C++全面但不高效的解法:使用全局标志变量来标识是否有错误发生; 注...原创 2018-09-26 15:09:24 · 120 阅读 · 0 评论 -
剑指offer------其他题目-----二进制中1的个数
1.题目:2.算法思路:1.涉及到二进制想到位运算:2.代码:int NumberOf1(int n){ int count = 0; while(n) { if(n&1) count++; n=n>>1; } return count;}3.问题:3.2改进:代码:int Nu...原创 2018-09-26 14:28:30 · 84 阅读 · 0 评论 -
*剑指offer-----二叉树的下一个节点
题目:思路:代码:BinaryTreeNode* GetNext(BinaryTreeNode* pNode){ if(pNode == NULL) return NULL; BinaryTreeNode* pNext = NULL; if(pNode->m_pRight != NULL) { BinaryTreeNode* pRight = p...原创 2018-10-02 10:03:31 · 173 阅读 · 0 评论 -
剑指offer------平衡二叉树
题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路平衡二叉树的定义是:所谓的平衡之意,就是树中任意一个结点下左右两个子树的高度差不超过 1。解题思路有两种,只遍历一次的方法最优。重复遍历多次:在遍历树的每个结点的时候,调用函数TreeDepth得到它的左右子树的深度。如果每个结点的左右子树的深度相差都不超过1,则这是一颗平衡的二叉树。这种方法的缺点是,首先判断根结点是不...原创 2018-10-02 09:12:19 · 238 阅读 · 0 评论 -
剑指offer-------二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路这道题蛮简单的,求二叉树的深度。可以是递归的方法,属于DFS(深度优先搜索);另一种方法是按照层次遍历,属于BFS(广度优先搜索)。代码:DFS:struct TreeNode{ int val; TreeNode *left; Tree...原创 2018-10-01 11:50:46 · 139 阅读 · 0 评论 -
剑指offer------二叉树中和为某一值的路径
题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路深度优先搜索。使用前序遍历,使用两个全局变量result和tmp,result来存放最终结果,tmp用来存放临时结果。每次遍历,我们先把root的值压入tmp,然后判断当前root是否同时满足:与给定数值相减为0; 左子树为空;...原创 2018-10-01 11:24:30 · 110 阅读 · 0 评论 -
字符串------找出01串中o和1连续出现的最大次数
题目:思路:记录遍历中的最大值,与temp比较,并交换代码:void Calculate(const char *str,int *max0,int *max1){ int temp0=0; //保存0串的最大长度 int temp1=0; //保存1串的最大长度 while(*str) { if(*str=='0') { ...原创 2018-09-14 18:42:30 · 759 阅读 · 0 评论 -
字符串------删除指定长度的字符
题目:代码:char *deleteChars(char *str,int pos,int len){ char *p = str+pos-1; //指向pos位置的字符 int tt = strlen(str); //计算字符的长度 if((pos<1)||(p-str)>tt) { return str; } if((p-str...原创 2018-09-14 18:25:25 · 627 阅读 · 0 评论 -
字符串-----判断字符串是否为回文
题目:思路:代码:int IsRevStr(char *str){ int i,len; int found=1; //表示是回文 if(str == NULL) { return -1; } len = strlen(str); for(int i=1;i<len/2;i++) { if(*(str+i)!=*(str+len-...原创 2018-09-14 16:11:16 · 214 阅读 · 0 评论 -
字符串------字符串中子串的查找
题目:算法:遍历第一个串与第二个串比较,从第一个串一个一个往后移动代码: 指针法:const char *strstr(const char* src,const char* sub){ const char *bp; const char *sp; if(src ==NULL || sub==NULL) { return src; } whil...原创 2018-09-14 16:01:06 · 259 阅读 · 0 评论 -
剑指offer------和为S的连续正数序列
题目:思路:代码:void FindContinuousSequence(int num){ //特例 if(sum<3) return; int small=1,big=2; while(small<big) { int cursum=(small+big)*(big-small+1)>>1; if(cursum...原创 2018-09-27 11:09:27 · 95 阅读 · 0 评论 -
剑指offer-----和为S的两个数字
题目:思路:代码:bool FindNumberWithSum(int data[],int length,int sum,int* num1,int* num2){ bool found = fasle; if(length<1 || num1==NULL || num2==NULL) return found; int ahead=0; ...原创 2018-09-27 15:23:39 · 135 阅读 · 0 评论 -
剑指offer------树的镜像
1.题目:2思路:3.代码:struct TreeNode{ int val; TreeNode *left; TreeNode *right;}class Solution{public: void Mirror(TreeNode *pRoot) { if((pRoot == NULL)||(pRoot->left==NULL)||(pRoo...原创 2018-09-30 18:12:13 · 113 阅读 · 0 评论 -
剑指offer------书的子结构
题目:思路:代码:struct TreeNode{ int val; TreeNode *left; TreeNode *right;}class Solution{public: bool HasSubtree(TreeNode *pRoot1,TreeNode *pRoot2) { bool result = fasle; if(pRoot1...原创 2018-09-30 18:00:37 · 122 阅读 · 0 评论 -
剑指offer------重建二叉树
题目输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路通常树有如下几种遍历方式:前序遍历:先访问根结点,再访问左子结点,最后访问右子结点。 中序遍历:先访问左子结点,再访问根结点,最后访问右子...原创 2018-09-29 18:15:50 · 177 阅读 · 0 评论 -
剑指offer-------单例模式
1.题目:2.思路:单例模式,是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例的特殊类。通过单例模式可以保证系统中,应用该模式的类一个类只有一个实例。即一个类只有一个对象实例。单例模式是设计模式中最简单的形式之一。这一模式的目的是使得类的一个对象成为系统中的唯一实例。要实现这一点,可以从客户端对其进行实例化开始。因此需要用一种只允许生成对象类的唯一实例的机制,“阻止”...原创 2018-10-07 17:17:44 · 210 阅读 · 0 评论 -
剑指offfer------字符流中第一个不重复的字符
题目请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。输出描述:如果当前字符流没有存在出现一次的字符,返回#字符。思路这道题还是很简单的。将字节流保存起来,通过哈希表统计字符流中每个字符出现的次数,顺便将字符流保存...原创 2018-09-28 19:23:24 · 134 阅读 · 0 评论 -
剑指offer-------1-------赋值运算符函数
1.题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。class CMyString{public:CMyString(char *pData=NULL);//构造函数CMyString(const CMyString& str);//拷贝构造函数~CMyString();//析构函数private:char* m_pData;//数据域,字符指针...原创 2018-10-07 11:39:09 · 130 阅读 · 0 评论 -
剑指offer------不用加减乘除做加法
题目:思路:思路首先看十进制是如何做的: 5+7=12,可以使用三步走:第一步:相加各位的值,不算进位,得到2。第二步:计算进位值,得到10. 如果这一步的进位值为0,那么第一步得到的值就是最终结果。第三步:重复上述两步,只是相加的值变成上述两步的得到的结果2和10,得到12。 同样我们可以三步走的方式计算二进制值相加: 5-101,7-111第...原创 2018-09-28 16:23:33 · 137 阅读 · 0 评论 -
剑指offer------1到n的和
题目求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。思路递归 与运算代码class Solution{public: int Sum_Solution(int n) { int sum = n; sum && (sum += Sum_Solution(...原创 2018-09-28 16:07:18 · 101 阅读 · 0 评论 -
剑指offer------回溯法
待跟原创 2018-10-07 10:19:37 · 178 阅读 · 0 评论 -
剑指offer------二叉搜索树
难原创 2018-10-07 10:18:41 · 96 阅读 · 0 评论 -
剑指offer-------序列化二叉树
后期再写原创 2018-10-06 11:12:51 · 113 阅读 · 0 评论 -
剑指offer-------之字打印二叉树
题目:思路: 代码:struct TreeNode{ int val; TreeNode *left; TreeNode *right;}void Print(BinaryTreeNOde* pRoot){ if(pRoot == NULL) return; stack<BinaryTreeNOde*>levels[2]; ...原创 2018-10-06 10:57:45 · 176 阅读 · 0 评论 -
剑指offer-------把二叉树打印成多行
题目:思路:代码:struct TreeNode{ int val; TreeNode *left; TreeNode *right;}void Print(BinaryTreeNOde* pRoot){ if(pRoot == NULL) return; queue<BinaryTreeNOde*>nodes; nodes.push...原创 2018-10-06 10:26:42 · 101 阅读 · 0 评论 -
剑指offer------扑克牌顺子
题目:思路:代码:class Solution{public: bool IsContinuous(vector<int> numbers) { int length=number.size(); if(length<=0) return fasle; //排序数组 sort(numbers.begin(),number...原创 2018-09-27 16:55:45 · 142 阅读 · 0 评论 -
剑指offer-----数组-----数组中只出现一次的数字
题目:数组中数字出现的次数一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度O(n),空间复杂度O(1)。思路标签:算法:问题分步解决 异或解答:使用异或运算的一个性质:任何一个数字异或它自己都等于0;那么如果从头到尾依次异或数组中的每个数,最终即是只出现依次的数字; 题中需要寻找两个只出现一次的数字,那么我们如果将原数...原创 2018-09-11 10:47:59 · 130 阅读 · 0 评论 -
剑指offer------字符串------表示树值的字符串
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。思路这道题还是比较简单的。表示数值的字符串遵循如转载 2018-09-13 17:23:01 · 199 阅读 · 0 评论 -
剑指offfer-----数组-----构建数组的乘积
题目给定一个数组A[0,1,...,n-1],请构建一个数组B[0,1,...,n-1],其中B中的元素B[i]=A[0]*A[1]*...*A[i-1]*A[i+1]*...*A[n-1]。不能使用除法。1、思路观察下公式,你会发现,B[i]公式中没有A[i]项,也就是说如果可以使用除法,就可以用公式B[i]=A[0]*A[1]*.....*A[n-1]/A[i]来计算B[i],但是...原创 2018-09-12 09:52:34 · 131 阅读 · 0 评论 -
剑指offer-----数组------数组中重复的数字
题目找出数组中的重复数字在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。Example:如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。问题解析:元素在0到n-1的范围; 给出任意一个重复数字。思路标签:算法:排序...原创 2018-09-12 09:30:49 · 149 阅读 · 0 评论 -
剑指offer-------数组------连续子数组的最大和
题目:代码:int FindGreatSum(int *pData,int length){ if((pData==NULL)||(length<=0)) return 0; int cursum=0; int maxsum=0; for(int i=0;i<length,i++) { //如果当前和小鱼0,将下个值赋给当前和 if(cur...原创 2018-09-03 16:45:10 · 87 阅读 · 0 评论 -
剑指offer-------数组------数组中出现次数超过一半的数字
题目数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路: 1.桶排序:输出最大桶的索引void tong(int *numbers,int length){ int a[100]={}; for(...原创 2018-09-03 16:31:01 · 91 阅读 · 0 评论 -
剑指offer------数组------将奇数放在前面偶数放在后面
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。思路用两个指针,一个从前遍历一个从后遍历,若前面的是奇数则pBegin++,若后面是偶数pend++,若前面的是偶数且后面的是奇数,则交换。第一步:拆分数组 第二步:遍历交换代码:vo...原创 2018-09-02 16:56:46 · 502 阅读 · 0 评论 -
剑指offer------数组------旋转数组的最小数字(二分法的升级)
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路1.直接遍历时间复杂度O(n)2.我们注意到旋转之后的数组实际上可以划分为两个排序的字数组,而且前...原创 2018-09-02 12:11:50 · 154 阅读 · 0 评论 -
剑指offer------数组------二维数组中的查找
题目在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路首先选取数组中右上角的数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数组,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则...原创 2018-09-02 11:07:59 · 142 阅读 · 0 评论