问题描述: 返回链表的中间结点(如果是两个则返回两个)
解法与分析: 用两个指针移动的方法来解决问题。一个指针每次移动1个结点,另外一个指针移动2个结点。
砍树的人开始学造斧!
问题描述: 返回链表的中间结点(如果是两个则返回两个)
解法与分析: 用两个指针移动的方法来解决问题。一个指针每次移动1个结点,另外一个指针移动2个结点。
问题描述: 二维数组中的查找。在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否包含该整数。
例如:
{
{1,2,3,4}
{2,4,6,7}
{4,5,7,8}
{6,7,8,9}
}解法与分析: 可以使用二分法来查找。
- 从四个角中找一个起点,向列走是递增&向行走是递减,或者,向列走是递减&向行走是递增。符合这个条件的只有左下角和右上角。
- 以左下角为例,定义两个指针,一个向上走(减),一个向右走(增)。
- 如何走?判断当前两个指针所指向二维数组中的值比搜索值大还是小,比搜索值大的话,向上走,比搜索值小的话,向右走。直到两个指针都停止不能走为止。
问题描述: 返回将一维数组向右旋转k个位置的结果。
比如,一维数组{1,2,3,4,5},k=2时,返回结果是{4,5,1,2,3}。 要求常数级空间复杂度,允许修改原有数组。解法与分析: 使用三旋转:全部旋转一次,前面0到k-1旋转一次,后面k到数组最后一个数旋转一次,就可以解决问题。
问题描述: 顺时针打印矩阵
例如:
{
{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解法与分析: 考虑几个特殊情况:行1列n,行n列1,行1列1。考虑到这几个后其实就不难了。
问题描述: 假设数组中字符无重复,输入一个字符数组,打印出字符的全部组合。例如:输入{a,b,c}输出a、b、c、ab、ac、bc、abc
解法与分析: 不使用辅助空间。输入一组n个字符的数组,将打印出C(1,n)+…+C(n,n)=2^n个组合。
1.按照从1到n作为一个循环,每次输出C(i,n)个组合。这样,我们只需要处理如何输出一个C(i,n)就可以解决问题。
2.处理C(i,n):i有两种特殊情况,一种是i=1,那么直接输出n个字符中每个字符就可以;一种是i=n,那么整个字符数组一起输出就可以。i>1&&i<n的情况,使用公式:C(i,n)=C(i-1,n)+C(i-1,n-1),配合递归来解决问题。类似的题型: [算法学习]Java实现字符串全排列
问题描述: Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。
分析:
这里有两种解法,一种是用递归,一种使用循环。用递归的解法看起来很很简单,只需几行的代码就可以搞定,但是却隐藏着巨大的空间消耗和时间 消耗 。一种使用循环来做,写起来有点难看,至少没递归写起来好看,但是却比递归效率更高,几乎没有内存消耗。