随笔分类 - 算法题
摘要:题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 思路:1.可以使用快速排序的思路,因为出现次数超过一半的数字肯定是中位数,使用Pa
阅读全文
摘要:题目:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。 结果请按字母顺序输出。输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。 思路:递归,回溯。 实现
阅读全文
摘要:题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。 思路:二叉搜索树中序遍历就是有序序列,把整个树拆成3部分,根,左子树,右子树。连接起来应该是,左子树的最右叶子节点的右指针指向根,根的左指针指向左子树最右节点,根的右指针指向右子
阅读全文
摘要:题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。 思路:递归回溯。先从先序遍历递归到叶子节点然后回溯所有的解。满足就加入结果集合。 实现代码:
阅读全文
摘要:输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点)。 一个巧妙的解法是这样的:复制next 如原来是A->B->C 变成A->A'->B->B'->C->C',然后通过前一个的random指针定位后一个random指针,然后拆分成两个链表即可。时
阅读全文
摘要:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。 解法是递归判断,先找根节点,划分左右子树递归求解。边界需要特殊考虑。 AC代码:
阅读全文
摘要:题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。 思路:使用一个辅助栈,在弹出
阅读全文
摘要:题目:定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。 思路:可以用一个变量来保存当前最小的数,但是这样在最小的数出栈之后剩余数的最小数怎么获取?这就需要使用一个同样大小的辅助栈,辅助栈保存当前最小的数,这样就能实现题目所要求的min函数。 实现代码:
阅读全文
摘要:题目: 输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵: 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. 思路:这个题比较麻烦,但是把每
阅读全文
摘要:题目:输入两颗二叉树A,B,判断B是不是A的子结构。 思路:题目的意思就是判断B是不是A的一部分,B是不是A的子树。遇到二叉树的问题首先想到用递归来解决。首先需要找个树A的一个节点p,使得p和B的头结点的值相等,然后判断p的左子树是不是等于B的左子树,p的右子树是不是等于B的右子树,如果相等说明B是
阅读全文
摘要:题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 思路:题目相对简单,有两个思路,一个是遍历两个链表的公共长度,按值的大小把各个节点连接起来,最后把较长链表的剩余部分追加到最后。第二个思路,这个类似于自然合并排序,可以使用递归分治的思想来解决问题,还
阅读全文
摘要:题目:输入一个链表,反转链表后,输出链表的所有元素。 思路:这个题目是一个很经典的链表操作题目,涉及很多链表指针操作,考验代码功底。因为是单向链表,如果按照最普通的思路来解和求链表中的倒数第k个节点一样,会有许多不必要的遍历。那么就需要在指针操作上想办法。下面是一个比较好的解决思路: 首先需要设置4
阅读全文
摘要:题目: 输入一个链表,输出该链表中倒数第k个结点。 思路: 因为是单向链表,如果使用最普通的遍历来解决的话会多出很多不必要的遍历。有一个比较好的解法,设置两个指针两个指针之间差k-1个位置,也就是当后面的指针遍历到链表尾部的时候前面的指针正好是链表的倒数第K个节点。这样就能提高程序的效率,简化思路。
阅读全文
摘要:题目描述: 输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。 思路: 这道题首先就能想到一个思路,运用快速排序的思想,设置前后两个指针,分别从数组的前后两端开始遍历,前指针遇到
阅读全文
摘要:题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。 这个题看似很简单,貌似用一个循环就能解决问题。就像下面这样: 可是这是万万不够的,要写出正确高质量的代码还需要斟酌一下,首先得考虑base为0并且指数为负数的情况,不然会出现0作为分
阅读全文
摘要:题目:输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。 思路:这个题目以前做过,是直接把数转换成二进制字符串,然后遍历一遍统计1的个数。《剑指Offer》上这道题目有3种位运算解法。最后一种是最优的。可以使用一个位运算的技巧,n & (n-1)可以把n的二进制数的最右边的1去掉。知道
阅读全文
摘要:题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路: 观察上面的矩形,如果使用2x1的矩形来覆盖2x8的矩形的话,设有f(n)中覆盖放法。首先,第一个2x1的矩形有两种放法,第一种,竖着放,剩下的部分有f(7)
阅读全文
摘要:题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路:和跳台阶不同,这只青蛙比较变态一下可以跳n级台阶。这样可以使用数学归纳法来证明其实答案是2^(n-1)。其实算出来几个就找出来规律了。 实现代码:
阅读全文
摘要:题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 思路:可以设f(n)为n级台阶的跳法种类。则n级台阶的情况,第一步有两种选择一种是跳一级,剩下的n-1级台阶有f(n-1)中跳法。另一种是跳两级,剩下的n-2级台阶有f(n-2)种跳法。那么n级台阶的跳
阅读全文
浙公网安备 33010602011771号