剑指offer
two_star
Email:xingxin.hsing@gmail.com
Blog:https://twostarxx.github.io/
展开
-
《剑指offer》面试题17:合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。思路:使用递归,将未排序的两个链表继续添加到next上。方法一:递归public ListNode merge(ListNode head1, ListNode head2) { if (head1 == null) return head2; if (head2 == null) return hea...原创 2018-03-14 22:25:41 · 165 阅读 · 0 评论 -
《剑指offer》面试题35:第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入“abaccdeff”,则输出'b'。思路:用哈希表记录每个char出现的次数。顺序哈希表用 LinkedHashMap。public char FirstNotRepeatChar(String str) { HashMap<Character, Integer> map = new LinkedHashMap<Charact...原创 2018-05-17 17:13:09 · 137 阅读 · 0 评论 -
《剑指offer》面试题37:两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。思路:计算两个链表的长度。用 k 走完长链表多出的长度,然后长短链表同时遍历,如果两个index相同,则该点为第一个公共结点。public static ListNode FistCommonNode(ListNode node1, ListNode node2) { if (node1 == node2) return node1; int ...原创 2018-05-17 17:50:02 · 164 阅读 · 0 评论 -
《剑指offer》面试题31:连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。思路一:对所有的数进行遍历。先判断之前的和是否为负,如果为负,置为0。加上当前值。判断是否为最大。思路二:动态规划。以第i个数结尾的最大和 = 第i个数 + 以第i-1个数结尾的最大和。(递归用循环实现,所以思路一实现与思路一相同)public int fin...原创 2018-05-12 18:35:23 · 137 阅读 · 0 评论 -
《剑指offer》面试题38:数组在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组{1, 2, 3, 3, 3, 3, 4, 5}和数字3,由于3在这个数组中出现了4此,因此输出4。思路:因为输入的数组为排序的,第一反应是二分查找。先二分查找k第一次出现的位置,再二分查找k最后出现的位置,进而位置相减+1。public int getNumK(int[] nums, int k) { int first =...原创 2018-05-25 18:29:02 · 160 阅读 · 0 评论 -
《剑指offer》面试题36:数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。思路:归并排序思想。...原创 2018-05-22 21:14:50 · 254 阅读 · 0 评论 -
《剑指offer》面试题32:从1到n整数中k出现的个数
题目:输入一个整数m,求从1到n这n个整数的十进制表示中k出现的次数。例如输入一个12,从1到12这些整数中包含1的数字有1,10,11和12,1一共出现了5次。思路:分别统计k出现在个位,十位,百位,千位...的个数。n = 2593, x = 5 为例来解释如何得到数学公式。从 1 至 2593中,数字 5 总计出现了 813 次,其中有 259次出现在个位,260次出现在十位,294次出现在...原创 2018-05-16 15:41:48 · 904 阅读 · 0 评论 -
《剑指offer》面试题33:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3, 32, 321},则打印出这3个数字能排成的最小数字321323。理论基础:数组排列后拼接的数字最小,则内部任意两个拼接的数字最小。因此,只需要比较数组中任意两个的大小。思路:外部采用快排(logn),进行比较;内部的比较采用 (str1+str2) ? (str2+str1)。标...原创 2018-05-16 17:49:34 · 139 阅读 · 0 评论 -
《剑指offer》面试题41:和为s的两个数字 VS 和为s的连续正数序列
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。思路:以{1, 2, 4, 7, 11, 15}和15为例进行讲解。定义两个指针,第一个指向0,第二个指向最后一个。...原创 2018-05-28 17:10:34 · 186 阅读 · 0 评论 -
《剑指offer》面试题42:翻转单词顺序VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。思路:以"I am a student."为例,翻转整个句子。例子为,".tneduts a ma I"。以空格为界,翻转单个单词。需要辅助方法去翻转void ...(char[], int st...原创 2018-05-28 18:22:56 · 170 阅读 · 0 评论 -
《剑指offer》面试题43:n个骰子的点数
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出k的所有可能的值出现的概率。思路:基于循环求骰子点数,时间性能好。在一次循环中,第一个数组中的第n个数字表示骰子和为n出现的次数。在下一次循环中,我们加上一个新的骰子,此时和为n的骰子出现的次数等于上一次循环中骰子点数和为n-1、n-2、n-3、n-4、n-5和n-6的次数的总和,所以我们把另一个数组的第n个数字设为前一个数组...原创 2018-05-30 15:41:23 · 501 阅读 · 0 评论 -
《剑指offer》面试题4:替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy. ”,则输出“We%20are%20happy.%20”。思路:StringBuffer类的使用首先,遍历一次字符串,统计出字符串中空格的总数,每替换一次空格,长度增加2,计算出替换之后字符串的总长度。声明两个指针,以“We are happy. ”为例,指针分别为13和16,从后往前复制,直到...原创 2018-06-19 13:41:43 · 136 阅读 · 0 评论 -
《剑指offer》面试题12:打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大 n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。易错点:由于没有规定n的范围,所以当输入的n很大的时候,直接使用int或者long会导致溢出。因此,涉及大数问题,必须使用String。思路:在字符串上模拟数字加法。以n=3为例,模拟加法时存在的几种情况:将字符串设置成char[n+1],便于打印和自增。(+1的原因会在后面...原创 2018-07-23 18:09:17 · 183 阅读 · 0 评论 -
《剑指offer》面试题6:重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结构,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中不含重复的数字。例如输入前序遍历序列{1, 2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出下图所示的二叉树并输出它的头结点。思路:在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。但在中序遍历序列中,根节点的值在序列的中...原创 2018-07-23 17:40:04 · 257 阅读 · 0 评论 -
《剑指offer》面试题18:树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。思路:分成两步在树A中找到和B的根节点的值一样的节点R; 判断树A中以R为根节点的子树是不是包含和树B一样的结构。因此有两个函数,函数1遍历树A找到等于rootB的节点,函数2比较 “rootA” 是否包含 “rootB”。// 找到tree1中等于tree2的root值相等的节点public static boolean h...原创 2018-08-01 20:57:32 · 151 阅读 · 0 评论 -
《剑指offer》面试题41:和为s的两个数字 VS 和为s的连续正数序列
和为s的两个数字题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。思路:由于是递增排序数组,所以考虑两个指针遍历,i 指针从头开始,j 指针从尾开始。如果 i 数和 j 数之和 > target,将 j 指针前移;如果小于target,将 i 指针后移。找到相等则return,找不到即(i=j-1 &am...原创 2018-08-06 21:46:46 · 256 阅读 · 0 评论 -
《剑指offer》面试题44:扑克牌的顺子
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。思路:将大小王设置为0。将5张牌进行排序,计算连续两数直接的空数值有多少个,与0的个数进行比较。如果 > 0的个数,则说明0无法全部填充,不是连续序列;否则,即<=,是连续。public boolean isContin...原创 2018-08-06 21:50:36 · 206 阅读 · 0 评论 -
《剑指offer》面试题34:丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。求按从小到大的顺序的第1500个丑数。例如1、2、3、4、5都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做第一个丑数。...原创 2018-05-17 16:58:41 · 141 阅读 · 0 评论 -
《剑指offer》面试题26:复杂链表的复制
题目:请实现一个函数用于复制一个复杂链表。在复杂链表中,每个结点除了有一个next指针指向下一个结点外,还有一个sibling指向链表中的任意结点或者null。方法一:时间O(n)。分为三个步骤。在每一个结点后面复制一个只包含next指针不含sibling的相同的结点。一次遍历O(n)复制结点的sibling指针,其中复制的结点指向的复制的结点。一次遍历O(n)分割链表。一次遍历O(n),难点注意...原创 2018-03-21 19:11:32 · 201 阅读 · 0 评论 -
《剑指offer》面试题2:实现Singleton模式
题目:设计一个类,只能生成该类的一个实例。public class SingletonDemo { private SingletonDemo() {} private static class SingletonDemoLoader { private static final SingletonDemo instance = new SingletonDemo(); } p...原创 2018-03-01 22:09:53 · 200 阅读 · 0 评论 -
《剑指offer》面试题3:二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路:每一次都是选取数组查找范围的右上角数字。如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角...原创 2018-03-01 22:43:37 · 136 阅读 · 0 评论 -
《剑指offer》面试题5:从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。思路:遍历的顺序是从头到尾的顺序,可输出的顺序确实从尾到头。这就是典型的“后进先出”,我们可以用栈实现这种顺序。 想到用栈实现函数,而递归在本质上就是一个栈结构,于是同样可以采用递归来实现。// 栈实现public void printListReversingly(ListNode root) { Lis...原创 2018-03-03 14:56:23 · 113 阅读 · 0 评论 -
《剑指offer》面试题9:斐波那契数列
题目一:写一个函数,输入n,求斐波那契(Fibonacci)数列的第n项,斐波那契数列的定义如下:思路:不要写递归,时间复杂度太高。public int Fibonacci(int num) { int n1 = 0, n2 = 1, i = 2; if (num == 0) return n1; if (num == 1) return n2; while (i < num...原创 2018-03-04 15:27:20 · 157 阅读 · 0 评论 -
《剑指offer》面试题7:用两个栈实现队列
题目:用两个栈实现一个队列。分别完成在队列尾部插入节点和在队列头部删除节点的功能。思路:public class StackAsQueue { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); ...原创 2018-03-04 14:07:58 · 95 阅读 · 0 评论 -
《剑指offer》面试题8:旋转数组的最小数字
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素的位置。例如数组{3, 4, 5, 1, 2}为{1, 2, 3, 4, 5}的一个旋转,该数组的最小值为1。思路:采用二分查找O(logn)比顺序遍历O(n)快。需要考虑相等数字的特殊情况,此时只能顺序遍历。public int minNumReversing(int[...原创 2018-03-04 15:12:29 · 133 阅读 · 0 评论 -
《剑指offer》面试题11:数值的整数次方
题目:实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。思路:求次方,需要考虑四种情况。底数为0,指数为负,无意义(采用全局变量);指数为0,返回1;指数为负,返回Power(1/base, exponent);指数为正,正常情况。注意:该题目说明“不考虑大数情况”。计算机在判断相等时,...原创 2018-03-12 21:45:50 · 193 阅读 · 0 评论 -
《剑指offer》面试题13:在O(1)时间删除链表结点
题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。情况:链表长度为1,删除是头结点且尾结点。链表长度为n,删除是头结点。链表长度为n,删除是尾结点。链表长度为n,删除中间结点。思路:将上述4种情况进行合并处理,可减少if个数。注意:node删除后置空。链表中没有node。特殊情况的考虑。方法一:从尾到头考虑,如果不是尾节点(n头,n中),如果是头(1头尾),如果是尾(...原创 2018-03-19 11:54:47 · 150 阅读 · 0 评论 -
《剑指offer》面试题28:字符串的排列
本文重点:如果面试题是按照一定要求摆放若干个数字,可以先求出这些数字的所有排列,然后再一一判断每个排列是不是满足题目给定的要求。基础题:字符串的排列题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出字符a、b、c所排列出来的所有字符串abc、acb、bac、bca、cab和cba。思路:将一个字符串看成两个部分:第一部分为它的第一个字符,第二部分是后面...原创 2018-03-22 18:32:21 · 276 阅读 · 0 评论 -
《剑指offer》面试题22:栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。加入压入栈的所有数字均不相等。例如序列1、2、3、4、5是某栈的压栈序列,序列4、5、3、2、1是该压栈序列对应的一个弹出序列,但4、3、5、1、2就不可能是该压栈序列的弹出序列。思路:最外层循环为push的压栈,中间需要while判断是否出栈(不能用if)。最外层不能用while!!!(记住记住)publi...原创 2018-03-19 18:14:09 · 168 阅读 · 0 评论 -
《剑指offer》面试题14:调整数组顺序使奇数位于偶数前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。思路:两个指针,一个从头,一个从尾。交换头指针的偶数与尾指针的奇数。注意:length<=2的情况,所以 j-i>=1,存在等号。public void reorderOddEven(int[] nums) { int i=0, j=nums.len...原创 2018-03-13 22:26:52 · 95 阅读 · 0 评论 -
《剑指offer》面试题15:链表中倒数第k个节点
题目:输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如一个链表有6个节点,从头节点开始它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。特殊情况:空链表。倒数第0个节点。k大于链表长度。public static ListNode findKthToTail(ListNode head, int k...原创 2018-03-13 23:00:06 · 151 阅读 · 0 评论 -
《剑指offer》面试题16:反转链表
题目:定义一个链表的头结点,反转该链表并输出反转后链表的头结点。思路:定义三个指针:中心结点的前结点(记录next需要转移到的位置),中心结点,中心结点(暂存,防止链表断裂)。将中心结点的next指针设置为中心结点的前结点。特殊情况:空链表。两个结点。注意:修改完后,head的next指针置空。最后一个节点的next指针置为前一个结点。public static ListNode reverseL...原创 2018-03-13 23:21:12 · 162 阅读 · 0 评论 -
《剑指offer》面试题24:二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数组都互不相同。概念:二叉搜索树,左子树都小于根结点,右子树都大于根结点。思路:遍历end前面的结点,通过左子树都小于根结点找到分界点,判断右子树是否都大于根结点(return false)。对树的左右子树进行递归。public static boo...原创 2018-03-20 13:26:20 · 142 阅读 · 0 评论 -
《剑指offer》面试题25:二叉树中和为某一值的路径
题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路:用栈记录路径,sum记录当前和。如果是叶结点,判断sum是否等于target,如果等于则输出。help的方法最后需要将栈顶弹出,sum-=。public static void findPath(TreeNode root, int target)...原创 2018-03-20 13:30:07 · 217 阅读 · 0 评论 -
《剑指offer》面试题29:数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1, 2, 3, 2, 2, 2, 5, 4, 2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。解法一:根据数组特点找出O(n)的算法思路:数组中有一个数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。在遍历数组的时候保存两个值:一个是数组中的...原创 2018-03-30 18:40:45 · 127 阅读 · 0 评论 -
《剑指offer》面试题19:二叉树的镜像
题目:请完成一个函数,输入一个二叉树,该函数输出它的镜像。方法一:递归思路:去掉空树、单节点的情况,将左子树临时保存,右子树赋值给左子树,递归进行交换。public static void MirrorRecursively(TreeNode root) { if (root == null) return ; if (root.left == null &&...原创 2018-08-02 21:59:57 · 923 阅读 · 0 评论