![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
cg110778
这个作者很懒,什么都没留下…
展开
-
34、
34、在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007思路:使用归并排序的思想,利用分治法,不断分解问题为子问题,即计算子数组间的逆序对,并使用辅助数组来排序子数组以防止重复添加逆序对的数量。...原创 2020-06-14 20:11:08 · 262 阅读 · 0 评论 -
33、
33、在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写).(从0开始计数)思路: 使用LinkedHashMap计算字符出现的次数,并按照顺序添加,再遍历字符串即可。...原创 2020-06-14 20:00:41 · 195 阅读 · 0 评论 -
32、
32、把只包含质因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含质因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。思路:只有丑数之间的乘积才是丑数,所以可以创建分别与2、3、5相乘的3个索引,然后找出其中最小的那个丑数 赋值给丑数数组,然后将最小丑数的相应的索引+1(为了找出过滤已经查找过的丑数),然后赋值即可。...原创 2020-06-14 19:57:26 · 209 阅读 · 0 评论 -
31、
31、输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。思路:使用Integer列表存储数组元素,再使用集合工具类的排序方法实现Comparator接口的compare方法,再把其转换为字符对象,再使用字符的compareTo方法进行排序,最后连接list中元素即可。...原创 2020-06-14 19:53:51 · 145 阅读 · 1 评论 -
30、
30、求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路:循环把所有数字转字符对象,然后在计算这个字符的char包含多少个1...原创 2020-06-14 19:50:57 · 93 阅读 · 0 评论 -
29、
29、HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1)思路:使用动态规划法,一个变量用来存储子问题的最大值,一个用来原创 2020-06-14 18:59:56 · 105 阅读 · 0 评论 -
28、
28、数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。思路: 排序后若存在此数字则位于数组中间...原创 2020-06-14 18:57:02 · 91 阅读 · 0 评论 -
27、
27、输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路:先排序,再把前k个数添加到ArrayList中。原创 2020-06-14 18:54:34 · 162 阅读 · 0 评论 -
26、
26、输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。思路:基于深度优先的思想使用回溯法,递归地找出所有排序,完成一个字符的交换就固定,再交换下个字符,直到达到字符串的索引。...原创 2020-06-14 17:23:26 · 96 阅读 · 0 评论 -
25、
25、输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路:中序遍历并改变结点指针。原创 2020-06-07 21:28:55 · 98 阅读 · 0 评论 -
24、
24、输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:使用两个ArrayList,一个存储路径,一个存储路径结点,运用递归来遍历所有路径,若遍历到叶子结点不为所找的路径,则移除此叶子结点。...原创 2020-05-17 20:10:07 · 110 阅读 · 0 评论 -
23、
23、输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路:利用二叉排序树的特点,即根结点的值大于所有左子树结点的值,小于所有右子树结点的值,然后找到分界点进行递归。...原创 2020-05-17 20:08:05 · 130 阅读 · 0 评论 -
22、
22、输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)思路:使用辅助栈存储压入顺序,判断是否栈顶元素与出栈数组的值相等,设计一个统计出栈数组索...原创 2020-05-07 10:47:54 · 82 阅读 · 0 评论 -
21、
21、定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。思路:用一个辅助栈的栈顶存储最小元素。...原创 2020-05-07 10:45:53 · 90 阅读 · 0 评论 -
20、
20、输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 1 2 3 4 5 6 7 8 9 10 11 12 1思路:上右下左依次循环添加。...原创 2020-05-07 10:43:07 · 90 阅读 · 0 评论 -
19、
19、操作给定的二叉树,将其变换为源二叉树的镜像。思路:使用递归交换左右子树。原创 2020-05-07 10:40:06 · 77 阅读 · 0 评论 -
18、
18、输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:详细考虑所有情况进行递归,设置一个标志为false,如果两个树有一个为空直接返回false,不为空时判断值是否相等,若等,使用是否为子树的函数进行是否为子树的判断,先判断node2,若为空说明遍历完了,返回true,若node1为空返回false,若两结点值不等返回false,若等再递归判断n...原创 2020-05-07 10:38:19 · 95 阅读 · 0 评论 -
17、
17、输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。思路:设置一个当前结点和合并头结点,穿针引线。...原创 2020-05-07 10:30:53 · 91 阅读 · 0 评论 -
10、
10、一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。思路:总结规律 f(n) = f(n-1)+f(n-2)+…+f(n-(n-1)) + f(n-n) => f(0) + f(1) + f(2) + f(3) + … + f(n-1), f(n-1) = f(0) + f(1)+f(2)+f(3) + … + f((n-...原创 2020-05-06 18:28:00 · 57 阅读 · 0 评论 -
15、
15、输入一个链表,输出该链表中倒数第k个结点。思路:设置快慢指针,当快指针走到第k个节点时,慢指针开始走,故当快指针到尾结点时,慢指针即为倒数第k个结点。...原创 2020-05-06 18:43:15 · 87 阅读 · 0 评论 -
14、
14、输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的思路:用两个新的linkedlist分别装奇数和偶数,或者类似冒泡排序,遇见前偶后奇就交换位置。...原创 2020-05-06 18:41:00 · 111 阅读 · 0 评论 -
13、
13 给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0思路:分情况讨论即可exponent>=以及<0.原创 2020-05-06 18:39:45 · 80 阅读 · 0 评论 -
12、
12、输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。思路:贴下牛客一位大佬的答案精彩绝伦!如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三...原创 2020-05-06 18:37:05 · 76 阅读 · 0 评论 -
11、
11、我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:思路:分情况讨论,先摆21,则有recover(target-1)种,先摆12,则有recover(target-2)种,斐波那契数列。...原创 2020-05-06 18:31:46 · 100 阅读 · 0 评论 -
9、
9、一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。思路:一次只能跳1或2,假如有n阶,最后一次跳1,则此时跳法与f(n-1)相同,最后一次跳2,则此时跳法与f(n-2)相同,故当n=1时,有1种跳法,n=2时有2种跳法,其他时候有f(n-1)+f(n-2)种斐波那契数列。...原创 2020-05-06 18:25:21 · 86 阅读 · 0 评论 -
8、
8、大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0)。n<=39思路:1、最简单的思路,递归。2、其次使用动态规划的思想记住当前结果的前两个数值。...原创 2020-05-06 18:23:50 · 110 阅读 · 0 评论 -
16、
16、输入一个链表,反转链表后,输出新链表的表头。思路:设置一个pre结点作为反转链表后的第一个结点,head为当前结点即反转链表后的头结点,next为下一个结点。...原创 2020-05-06 18:49:14 · 81 阅读 · 0 评论 -
7、
7、把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:二分查找,分情况讨论mid和high位置元素之间的大小关系,如果array[mid]>array[hi...原创 2020-04-11 17:58:04 · 148 阅读 · 0 评论 -
6、
6、用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思路:stack1 用来入队列,stack2 用来出队列。如果stack2不为空,就直接出栈,否则把stack1中的元素出栈,再添加进stack2中再出栈。...原创 2020-04-11 17:56:25 · 98 阅读 · 0 评论 -
5、
5、输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:利用递归思想和依据前序遍历的第一个节点为根节点,然后以此把中序 遍历结果分开。...原创 2020-04-11 17:53:10 · 84 阅读 · 0 评论 -
4、
4、输入一个链表,按链表从尾到头的顺序返回一个ArrayList。思路:使用栈或者集合的翻转来实现逆序。原创 2020-04-11 17:48:38 · 66 阅读 · 0 评论 -
3、
3、 请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思路:使用StringBuffer的charAt方法来遍历StringBuffer对象的所有字符,并进行判断和替换,使用个新对象接受并通过toString方法转成字符串。...原创 2020-04-11 17:47:34 · 99 阅读 · 0 评论 -
2、
2、 从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:使用队列实现二叉树的层次遍历,并使用Integer封装类数组进行存储。原创 2020-04-11 17:44:06 · 70 阅读 · 0 评论 -
1、
1、 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:最简单的:遍历二维数组。复杂度较低的:从数组的左下角元素开始判断,如果大于,就向右移动列,如果小于,就向上移动行,直到找到相等或遍历完数组位置。...原创 2020-04-07 17:13:27 · 81 阅读 · 0 评论