剑指offer
Cecilia_whf
这个作者很懒,什么都没留下…
展开
-
剑指offer:合并两个排序的链表
问题描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 分析 最简单的情况,如果其中一个链表为空,那么直接输出另一个链表。 对于两个链表都不为空的情况,一般方法,假设两个已知的链表分别为pHead1,pHead2,则新建一个结果链表pHead。从两个链表的头部开始,如果pHead1的值大于pHead2的,把pHead2的值存入pHead,然后用pH原创 2017-10-18 22:04:35 · 249 阅读 · 0 评论 -
剑指offer:二叉树的下一个结点
题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。 /* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *n原创 2017-11-12 16:01:46 · 203 阅读 · 0 评论 -
剑指offer:不用加减乘除做加法
问题描述 写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。 class Solution { public: int Add(int num1, int num2) { } }; 分析 由于不能用四则运算,所以不可避免的,我们还是要用位运算,我们都知道在二进制中:0+0=0,0+1=1,1+0=1,1+1=0,由此可以看出位与位之间的运原创 2017-10-25 21:28:02 · 272 阅读 · 0 评论 -
剑指offer:调整数组顺序使奇数位于偶数前面
题目描述 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 分析 代码思想:新建一个数组,并设置奇数指针j,依次判断原数组的元素奇偶性,如果是奇数将其放入数组中,并j+1,如果是偶数,则插入在奇数后(即array.begin()+j之前)。该题重点在于:对于vector各函数原创 2017-10-16 20:50:41 · 195 阅读 · 0 评论 -
剑指offer:数字在排序数组中出现的次数
问题描述 统计一个数字在排序数组中出现的次数。 class Solution { public: int GetNumberOfK(vector data ,int k) {} }; 分析 最笨最耗时的方法,从头遍历,如果等于k,开始计数,不等于k时返回计数结果。但是这样时间复杂度为o(n),比较麻烦。 比较聪明的方法1:因为排序数组,所以二分法找到第一个k,记下下标i,然后同样方法找原创 2017-11-01 21:14:43 · 245 阅读 · 0 评论 -
剑指offer:平衡二叉树
题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树。 分析 首先确定什么是平衡二叉树,它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。所以,如果该二叉树为空,那么一定是平衡二叉树,然后判断它的左右子树的高度差,直接写函数获得子树的高度差,如果绝对值小于2,继续往下分别判断该二叉树左子树的左右子树的高度差和右子树的左右子树的高度差。 代码 clas原创 2017-10-14 23:11:45 · 214 阅读 · 0 评论 -
剑指offer:字符流中第一个不重复的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符”go”时,第一个只出现一次的字符是”g”。当从该字符流中读出前六个字符“google”时,第一个只出现一次的字符是”l”。 class Solution { public: //Insert one char from stringstream void Insert(char ch)原创 2017-10-23 21:20:36 · 265 阅读 · 0 评论 -
剑指offer:二叉树的镜像
问题描述 操作给定的二叉树,将其变换为源二叉树的镜像。 例子 二叉树的镜像定义:源二叉树 8 / \ 6 10 / \ / \ 5 7 9 11 镜像二叉树 8 / \ 10 6 /原创 2017-10-14 22:27:56 · 230 阅读 · 0 评论 -
剑指offer:构建乘积数组
题目描述 给定一个数组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]。不能使用除法。 分析 重点在于不能用除法,其实我觉得如果不说这一条的话,我们可能直接想到的就是用除法,算出A中所有元素的乘积除以A[i]直接就可以获得B[i]了,现在不能用,那就一个一个乘吧,跳过A[i]。代码如下: cla原创 2017-10-13 21:18:14 · 231 阅读 · 0 评论 -
剑指offer:求1+2+3+……n
题目描述求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。分析由于排除了乘除法,所以我们就不能直接套公式了,后面又排除了循环和条件选择,所以我们之前所熟悉的方法都不能用了。留给我们的唯一一条路就是,用其他方法来代替曾经的条件判断语句,这个方法就是:短路求值,那么什么是短路求值,百科是这么说的:作为"&&"和"||原创 2017-10-12 17:39:17 · 338 阅读 · 0 评论 -
剑指offer:数组中只出现一次的数字
题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 思路分析 首先分析如果数组中只有一个数字只出现一次,在这个时候,我们可以利用一个数异或它本身等于0这个特性,从头异或至尾即可获得只出现了一次的数(此时直接在循环中进行与运算即可)。那么有两个出现一次的数时,我们可以将这个数组分成两部分,每一部分都包含一个只出现一次的数。区分的方法: 将数组中所原创 2017-10-21 19:26:08 · 222 阅读 · 0 评论 -
剑指offer:数组中重复的数字
题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 分析 因为找出任意一个重复的数字,所以排序,然后找出第一个跟后面的元素相等的元素输出就是返回结果。 当然,也有比较高端原创 2017-11-22 21:10:23 · 248 阅读 · 0 评论