![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
ruthless_killer
good
展开
-
第三题 二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排列,每一列都按照从上到下递增的顺序排列。请完成这样一个函数,输入一个二维数组和一个整数,判断是否有该整数。例如下面的例子:找到返回true,没找到返回false1 2 8 92 4 9 124 7 10 136 8 11 15bool FindValue(int *a原创 2017-07-20 16:06:05 · 169 阅读 · 0 评论 -
单链表
//链表删除结点void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted){ if(pListHead == NULL|| pToBeDeleted == NULL) return; //不是尾 if(pToBeDeleted->m_pnext != NULL) { Li原创 2017-08-14 08:46:33 · 124 阅读 · 0 评论 -
栈的压入弹出序列
//栈的压入弹出序列bool IsPopOrder(const int* pPush,const int* pPop,int n){ bool res = false; if(pPush != NULL && pPop != NULL && n > 0) { const int *pNextPush = pPush; const int *pNextPop = pP原创 2017-09-06 18:41:51 · 144 阅读 · 0 评论 -
从上到下打印二叉树
//从上到下打印二叉树 void PrintRromTopToBottom(BtNode* ptr) { if(!ptr) return ; deque原创 2017-09-06 18:43:34 · 200 阅读 · 0 评论 -
二叉搜索树的后序遍历序列
//二叉搜索树的后序遍历序列 bool VerifySquencrOFBST(int sequence[],int n) { if(sequence == NULL || n<=0) return false; int root = sequence[n-1];//左子树值都小于根节点int i=0;for(;i<n-1;++i){ if(se原创 2017-09-06 18:44:25 · 120 阅读 · 0 评论 -
二叉树中和为某一值的路径
//二叉树中和为某一值的路径 void FindPath(BtNode* pRoot,int expectedSum,vector& path,int currentSum) { currentSum += pRoot->m_val; path.push_back(pRoot->m_val);//如果是叶节点,并且路径上的点和等于输入的值//打印这条路径bool isLe原创 2017-09-06 18:45:13 · 112 阅读 · 0 评论 -
复杂链表的复制
struct ComplexListNode { int m_val; ComplexListNode* m_pNext; ComplexListNode* m_pSibling; }; void CloneNodes(ComplexListNode* pHead) { ComplexListNode* pNode = pHead; whil原创 2017-09-06 18:45:57 · 126 阅读 · 0 评论 -
将一个二叉搜索树转换成双向链表
void ConvertNode(BtNode* pNode,BtNode** pLastNodeInList) { if(pNode == NULL) return;BtNode* pCurrent = pNode;if(pCurrent->m_pleft != NULL) ConvertNode(pCurrent->m_pleft,pLastNodeInL原创 2017-09-06 18:46:37 · 169 阅读 · 0 评论 -
自符串的全排列
void Permutation(char* pStr,char* pBegin) { if(*pBegin == ‘\0’) cout<原创 2017-09-06 18:47:29 · 216 阅读 · 0 评论 -
数组中次数超过一半的数字
bool g_bInputInvalid = false; bool CheckInvalidArray(int numbers[],int length) { g_bInputInvalid = false; if(numbers == NULL && length <=0) g_bInputInvalid = true; return g_bI原创 2017-09-06 18:48:24 · 163 阅读 · 0 评论 -
最小的k个数
int Patition(int data[],int length,int start,int end) { if(data == NULL|| length<=0 || start<0 || end>=length) throw new exception(“invalid parameters”); int index = start; swa原创 2017-09-06 18:50:52 · 182 阅读 · 0 评论 -
第十一题 数值的整数次方
例如:2^8可以理解为两个2^4相乘,而2^4是两个2^2相乘,2^2是两个2相乘,所以一共只计算了三次,用递归的方法比较高效。bool Equal(double num1,double num2){ if((num1-num2 > -0.00001) && (num1-num2 < 0.00001)) return true; else retur原创 2017-08-04 17:11:21 · 214 阅读 · 0 评论 -
第十题 求一个数中二进制有多少个 一
题目:数入一个整数,输出这个数中二进制的一的个数每次判断最右边的数是否为一,然后右移一位的方法不可取,因为负数经过多次右移之后会变成0xFFFF FFFF,程序就会变成死循环,用一个比较好的方法,用输入的数和这个数减一的值做与运算,会将这个数最右边的一变为零,更新这个数,很快就能求出这个数中有多少个一。int Number0f1(int n){ int coun原创 2017-08-02 13:58:25 · 159 阅读 · 0 评论 -
第四题 替换空格
题目: 请实现一个函数,把字符串中的每个空格替换成”%20”,例如输入”we are happy”,则输出”we%20are%20happy”。可以使用这样的方法: 先遍历一遍字符串,求出字符串中空格的个数,由此,可以计算出替换之后的字符串的总长度,然后标记出字符串的末尾p1和替换之后的末尾p2。再逐步往前移动p1,p2,同时将p1数据复制到p2的位置中,如果p1指向了一个空格,则将p1往前移动原创 2017-07-20 17:41:31 · 145 阅读 · 0 评论 -
第一题 赋值运算符的重载
要注意的问题: 防止自赋值,是否有内存泄漏,返回值的类型以及参数类型#include <iostream>using namespace std;class CMystring{public: CMystring(char *pData = NULL) { if(pData == NULL) { m_pData = n原创 2017-07-18 21:11:36 · 248 阅读 · 0 评论 -
第二题 单例模式
单例模式原创 2017-07-18 21:13:27 · 166 阅读 · 0 评论 -
第五题 从尾到头打印单链表
输入一个链表的头结点,从尾到头打印每一个节点 struct Listnode { int m_key; Listnode* m_pnext; };很容易想到用到栈去实现,遍历一遍链表,并入栈,再栈顶逐步获取栈顶元素打印并出栈就好了void ReversePrintList_stack(const Listnode *pHead){ if(pHead == NULL原创 2017-07-23 09:29:50 · 170 阅读 · 0 评论 -
第七题 用两个栈实现队列
题目:用两个栈实现队列,队列的声明如下,用两个函数appendTail和deleteHead实现尾插和头删:template<typename T>class CQueue{public: CQueue(); ~CQueue(); void appendTail(const T& node); T deleteHead();private: stack原创 2017-07-24 14:46:51 · 180 阅读 · 0 评论 -
第八题 旋转数组中的最小数字
题目:把一个数字最开始的若干个元素搬移到末尾,称之为数组的旋转。输入一个递增排序数组的一个旋转,输出最小元素。例如输入{3,4,5,1,2}求出最小数字。利用二分查找的思想,用一个指针指向开头,另一个指针指向末尾,然后找到中间位置,如果中间位置的值大于开头元素的值,则说明旋转的部分在中间位置的后面,则从后面的位置中使用同样的方法寻找,如果中间的值小于末尾的值,说明最小值应该是中间值或中间值的前面。原创 2017-07-24 17:24:02 · 168 阅读 · 0 评论 -
第九题 斐波那契数列
题目一:输入n,求出斐波那契数列的第n项的。 题目二:一只青蛙,一次可以跳上一级台阶,也可以跳上2级台阶,求青蛙跳上n级台阶有多少种跳法。 总数:f(n) = f(n-1) + f(n-2) 。根据f(0)和f(1)求出f(2),再根据f(1)和f(2)算出f(3),以此类推就可以算出第n项了。时间复杂度O(n)。int Fibio(int n){ int ar[2] = {0,1};原创 2017-08-02 13:39:05 · 356 阅读 · 0 评论 -
二叉树
题目:输入某二叉树的前序遍历和中序遍历结果,请重建二叉树。假设输入的前序遍历和中序遍历都没有重复数字,例如{1,2,4,7,3,5,6,8}和{4,7,2,1,5,3,8,6},返回根节点,二叉树定义如下:struct BtNode{ int m_val; BtNode* m_pleft; BtNode* m_pright;};首先根据前序遍历的第一个节点找到根结点,然后原创 2017-07-23 11:14:58 · 133 阅读 · 0 评论 -
顺时针打印矩阵
例如矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16输出:1 2 3 4 8 12 16 15 14 13 5 9 6 7 11 10 //顺时针打印矩阵void PrintMatrixInCirclie(原创 2017-08-16 16:12:38 · 141 阅读 · 0 评论 -
包含min函数的栈
template<typename T>class StackWithMin{public: void push(const T& value) { m_data.push(value); if(m_min.size()==0||m_min.top()<value) m_min.push(value); e原创 2017-08-16 16:15:09 · 118 阅读 · 0 评论 -
统计逆序对
//统计逆序对 int InversePairsCore(int arr[],int copy[],int start,int end) { if(start == end) { copy[start] = arr[start]; return 0; } int length = (end-start)/2;原创 2017-09-06 18:52:22 · 319 阅读 · 0 评论