
剑指offer
文章平均质量分 57
爱买耳钉的阿喵阿汪
研究生,学习编程中。
展开
-
用两个栈实现队列
题目描述用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。解题思路定义两个栈stack1和stack2,用来轮流存队列中的元素。轮流的意思就是,每次只用一个栈存所有元素。其中,stack1存元素的方式是,栈顶为队尾元素;stack2的栈顶为队头元素。当需要进行队列的push操作时,首先将所有stack2中所有元素都压到stack原创 2017-07-14 23:00:05 · 240 阅读 · 0 评论 -
链表中倒数第k个结点
题目描述输入一个链表,输出该链表中倒数第k个结点。解题思路定义两个指针p1和p2,相隔k个结点的位置,p2在前。同时向前移动p1和p2,直到p2为NULL(尾后指针),此时p1指向链表倒数第k个结点。需要注意的是,链表的长度可能不到k,这样就根本不存到倒数第k个结点,需要返回NULL。判断的方法是,在初始化p1和p2时,如果还没将p2移到相应的位置,就已经超原创 2017-07-24 22:49:57 · 449 阅读 · 0 评论 -
调整数组顺序使奇数位于偶数前面
题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。解题思路本题可以采用2.5次遍历的方法来解决。为什么说是2.5次呢?看了下面就知道了。第一次遍历,找出数组中所有偶数,按照相对次序存到另外一个新建的数组中。第二次遍历,把数原创 2017-07-24 22:23:06 · 297 阅读 · 0 评论 -
数值的整数次方
题目描述给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。解题思路本题需要注意几个点:1. 如果指数exponent是0,那么base不能为0,并且base(不为0)的exponent次方是1。2. 如果指数exponent是负整数,那么base不能为0,并且base(不为0)的expone原创 2017-07-23 19:54:29 · 365 阅读 · 0 评论 -
重建二叉树
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。解题思路本题需要利用递归的思想。首先,因为前序遍历的顺序是根节点->左子树->右子树,因此前序遍历的第一个元素就是二叉树的根原创 2017-07-08 08:25:25 · 461 阅读 · 0 评论 -
从尾到头打印链表
题目描述输入一个链表,从尾到头打印链表每个节点的值。解题思路两种方法。第一种是递归法,对于每个节点head,先从尾到头打印以head->next为头节点的链表,再打印head本身的值。第二种方法用栈,从前到后遍历一遍链表,将每个节点的值依次压到栈中,然后再将栈中元素依次出栈即可。代码/*** struct ListNode {*原创 2017-07-08 08:18:14 · 408 阅读 · 0 评论 -
替换空格
题目描述请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy,则经过替换之后的字符串为We%20Are%20Happy。解题思路需要遍历两遍。第一次遍历,从前向后遍历即可,记录空格的个数count,从而计算出将空格替换后字符串的大小original size + count * 2。因为原先空格只占一个字符,而替换后占三个字原创 2017-07-08 08:11:02 · 401 阅读 · 0 评论 -
二维数组中的查找
题目描述在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解题思路首先,根据这个二维数组array的特点,数组左上角元素array[0][0]是最小值,数组右下角元素array[m-1][n-1]是最大值(假设数组的大小是m*n)。从右上角元素原创 2017-07-08 07:59:53 · 379 阅读 · 0 评论 -
二进制中1的个数
题目描述输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。解题思路首先需要注意,负数的补码是其反码加1(符号位为1),将负数转化为相应正数的想法是不可行的,因为它们的二进制补码是不一样的(不仅是符号位不同)。然后需要注意,每次判断该整数的最后一位是否为1,然后将该整数右移一位的想法也是不可行的。因为有符号数的移位是算术移位,而不是逻辑移位。这意味着原创 2017-07-15 10:57:39 · 308 阅读 · 0 评论 -
矩形覆盖
题目描述我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解题思路假设覆盖一个2*n的矩形总共有F(n)种方法,则F(n)=F(n-1)+F(n-2). 这个表达式的含义是,可以先用1个2*1的小矩阵竖放覆盖大矩形的一列,然后再用其他的小矩形覆盖剩下的2*(n-1)的部分;或者可以先用2个小矩形覆原创 2017-07-15 10:57:26 · 362 阅读 · 0 评论 -
变态跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路假设青蛙跳上一个n级的台阶总共有F(n)种跳法,则F(n)=F(n-1)+F(n-2)+...F(1)+1. 这个表达式的含义是,青蛙可以先跳上n-1级台阶,再跳1级台阶;也可以先跳上n-2级台阶,再跳2级台阶;......;也可以先跳上1级台阶,再原创 2017-07-15 10:56:05 · 351 阅读 · 0 评论 -
跳台阶
题目描述一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解题思路假设青蛙跳上一个n级的台阶共有F(n)种跳法,则F(n)=F(n-1)+F(n-2)。这个表达式的意思是,青蛙可以先跳上n-1级台阶,再跳1级台阶;也可以先跳上n-2级台阶,再跳2级台阶。另外考虑边界条件,F(1)=1, F(2)=2.可以看出,这个表达式跟原创 2017-07-15 10:55:06 · 394 阅读 · 0 评论 -
斐波那契数列
题目描述大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。n解题思路设斐波那契数列的第n项为F(n),则有F(n)=F(n-1)+F(n-2), n>=2. 并且F(0)=0, F(1)=1.求解斐波那契数列可以用递归方法,但是会很慢。比较快的方法是,设置两个变量f1和f2,其中f2表示当前项,f1表示前一项。要求解下一项时,求这两项原创 2017-07-15 10:54:42 · 462 阅读 · 0 评论 -
旋转数组的最小数字
题目描述把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。解题思路首先理解一下题目的意思。原先的数组是一个非递减排序的数组,意味着每一个元素都大于等原创 2017-07-14 23:00:47 · 278 阅读 · 0 评论 -
反转链表
题目描述输入一个链表,反转链表后,输出链表的所有元素。解题思路定义三个指针p1, p2, p3,分别指向前一个元素,当前元素和后一个元素。将p2的next改为p1,完成p2处的反转,然后令p1=p2, p2=p3,继续下一个元素的反转,直到p2指向尾后元素。注意1,如果链表中没有元素或者只有一个元素,不需要反转,直接返回即可。注意2,当p2指向链原创 2017-07-24 23:01:59 · 460 阅读 · 0 评论