随笔分类 - 剑指Offer题目整理
对《剑指Offer》上的题目进行整理,并给出完整的Java实现的代码。
摘要:题目描述: 输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 题目分析: 最简单的是使用字典序生成法,这样可以把有重复字符串的情况也考虑进去。 Java实现代码:
阅读全文
摘要:题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题目分析:这其实就是斐波拉契数列,递归的思想,用递推来实现,防止栈溢出。
阅读全文
摘要:题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 题目分析: f(0) = 1; 表示n级台阶一次跳n级,只有一种跳法 f(1) = 1; f(2) = 2; f(3) = f(2) + f(1)+ f(0) ... f(n)
阅读全文
摘要:题目描述:请完成一个函数,输入一个二叉树,该函数输出它的镜像 题目分析:先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子结点。当交换完所有非叶子结点的左右子结点之后,就得到了树的镜像。 Java代码:
阅读全文
摘要:题目描述:树的子结构 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) 题目分析:此题可以拆成两题,1.在二叉树中查找是否存在某个结点;2.判断两个二叉树是否有相同的结构 Java代码:
阅读全文
摘要:题目描述:输入两个单调递增的链表list1,list2,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 题目分析: 1.对于链表题目,首先考虑边界情况,即链表为空的情况,提升代码的鲁棒性。 2.合并完一个结点后,剩余的链表仍然是有序的,再合并下一个结点时的过程是一样的,这是一种
阅读全文
摘要:题目描述:输入一个链表,输出该链表中倒数第k个结点 题目分析:因为不能直接从链表的尾部遍历,所以要分两步走: 第一步:从链表的头部开始遍历,直至链表的尾部,统计出链表结点的个数 第二步:根据链表结点的个数,计算出倒数第k个结点的位置(从头部看的位置),即n-k+1个结点,输出该结点。 Java代码:
阅读全文
摘要:题目描述:调整数组顺序使奇数位于偶数前 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 题目分析: 题目的关键在于在移位以后,奇数和奇数以及偶数和偶数之间的相对位置保持不变。
阅读全文
摘要:题目描述:数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 题目分析:题目的关键在于要考虑exponent为负数的情况。 Java代码:
阅读全文
摘要:题目描述: 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 题目分析: 暴力破解时间复杂度太高,本题有两种思路:1. 将每行看成一个有序数组,用二分查找2. 从左下角开始查找,若大
阅读全文
摘要:题目描述:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 题目分析:无论使用什么方式,最关键的就是要考虑负数的处理方式 扩展一下: 1. 用一条语句判断一个整数是不是2的整数次方 答:判断这个整数的二进制表示的1的个数是不是1个即可。 2. 输入两个整数m和n,计算需要改变m的二进
阅读全文
摘要:题目描述:输入一个链表,从尾到头打印链表每个节点的值。 题目分析:用栈;Java用Stack不如用Deque接口,原因可以见链接:http://stackoverflow.com/questions/12524826/why-should-i-use-deque-over-stack
阅读全文
摘要:题目描述:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项。(n<=39) 题目分析:如果使用简单的递归,很容易造成栈溢出。采用递推的方式即可。 代码:
阅读全文
浙公网安备 33010602011771号