剑指offer刷题
GReenland-mengxin
这个作者很懒,什么都没留下…
展开
-
面试题43.1~n整数中1出现的次数
题目描述:求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。解析:公式法。若百位上数字为0,百位上可能出现1的次数由更高位决定;若百位上...原创 2019-09-04 17:47:02 · 163 阅读 · 0 评论 -
44.扑克牌的顺子
题目描述:LL今天心情特别好,因为他去买了一副扑克牌,发现里面居然有2个大王,2个小王(一副牌原本是54张_)…他随机从中抽出了5张牌,想测测自己的手气,看看能不能抽到顺子,如果抽到的话,他决定去买体育彩票,嘿嘿!!“红心A,黑桃3,小王,大王,方片5”,“Oh My God!”不是顺子…LL不高兴了,他想了想,决定大\小 王可以看成任何数字,并且A看作1,J为11,Q为12,K为13。上面的5...原创 2019-08-11 20:46:38 · 96 阅读 · 0 评论 -
41.2和为s的开内需整数序列
题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!Java代码实现:import java...原创 2019-08-11 18:31:25 · 79 阅读 · 0 评论 -
41.和为s的两个数字
题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。解析:定义两个指针,一个从零开始,一个从最后一个数字开始,如果和太大则后边指针往前,如果小了前面的指针往后。Java代码实现:import java.util.ArrayList;public class Solution { ...原创 2019-08-11 18:00:10 · 67 阅读 · 0 评论 -
平衡二叉树
题目描述:输入一棵二叉树,判断该二叉树是否是平衡二叉树。解析:左右子树深度不超过1,即平衡因子<=1Java代码实现:public class Solution { public boolean IsBalanced_Solution(TreeNode root) { &nb...原创 2019-08-11 17:43:21 · 83 阅读 · 0 评论 -
42.1反转单词序列
题目描述:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student.a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?解析:将整个句子反转,...原创 2019-08-11 15:21:32 · 109 阅读 · 0 评论 -
42.左旋转字符串
题目描述:汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!解析:将字符串分为两部分,先将前面0-n个字符进行反转,再将后面剩余的字符反转,最后将全部字符串...原创 2019-08-11 14:56:32 · 62 阅读 · 0 评论 -
19.二叉树的镜象(反转)
题目描述:操作给定的二叉树,将其变换为源二叉树的镜像。解析:交换每个节点左右子树的位置Java代码:import java.util.*;public class Solution { public void Mirror(TreeNode root) { if(r...原创 2019-08-11 14:10:00 · 129 阅读 · 0 评论 -
39.二叉树的深度
题目描述:输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。解析:利用递归,如果左子树比右子树大则长度+1,反之右边深度+1。Java代码实现:public class Solution { public int TreeDepth(TreeNode root) { &n...原创 2019-08-10 22:01:08 · 51 阅读 · 0 评论 -
面试题.变态跳台阶
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。解析:数学归纳法得到:f(n) = 2^(n-1)Java代码实现:public class Solution { public int JumpFloorII(int target) { &nbs...原创 2019-08-14 21:50:15 · 87 阅读 · 0 评论 -
面试题12.矩阵中的路径
题目描述:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。例如a b c es f c sa d e e矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b...原创 2019-08-15 17:08:17 · 95 阅读 · 0 评论 -
45.圆圈中最后剩下的数字
题目描述:每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0…m-1报数…这样下去…直到剩下最后...原创 2019-08-12 11:50:26 · 69 阅读 · 0 评论 -
面试题41.数据流中的中位数
题目描述如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。***解析:创建优先级队列维护大顶堆和小顶堆两个堆,并且小顶堆的值都大于大顶堆的值,2个堆个数的差值小于...原创 2019-09-03 13:06:01 · 144 阅读 · 0 评论 -
面试题40.最小的k个数
题目描述:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。解析:时间复杂度为O(nlogn)的算法,特别实用于海量数据处理。先建立一个大小为k的数据容器来存储最小的k个数字,接下来每次从输入的n个整数中读入一个数。如果容器中已有的数字少于k个,则直接把这次读入的整数放入容器之中;如果容器中已有k个数字,即容器已满,此时我...原创 2019-09-02 21:19:03 · 184 阅读 · 1 评论 -
面试题28.对称的二叉树
题目描述:请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。解析:判断左子树的右孩子与右子树的左孩子是否相等,左子树的左孩子与右子树的右孩子是否相等,并且节点值要相等,利用递归即可实现。Java代码实现:public class Solution { boolean isSymmetrical(TreeNode pRoot...原创 2019-08-29 15:13:49 · 103 阅读 · 0 评论 -
面试题23.链表中环的入口节点
题目描述:给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。解析:两个指针一快一慢,若链表没有环则快指针不可能与慢指针相遇,返回null。若有环则二者必然相遇:快指针与慢指针在环中第一次相遇即slow=fast时,将slow保持不变,而将fast=pHead,此时二者开始第二次往后走直到再次相遇即可得到环的入口节点。Java代码实现:public class Sol...原创 2019-08-21 16:53:18 · 129 阅读 · 0 评论 -
面试题13.机器人的运动范围
题目描述:地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?解析:将方格看作mxn的矩阵,除了边界上的...原创 2019-08-16 11:02:37 · 116 阅读 · 0 评论 -
37.两个链表的第一个公共节点
题目描述:输入两个链表,找出它们的第一个公共结点。解析:定义俩哥哥指针,遍历两个链表,将长的链表指针开始往后当剩余节点的长度与另一条链表相同时,同时往后遍历,当遇到相同节点时输出,即得到第一个公共节点Java代码实现:import java.util.*;public class Solution { public ListNode FindFirs...原创 2019-08-12 16:25:41 · 114 阅读 · 0 评论 -
面试题19.正则表达式匹配
题目描述:请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配Java代码实现:public class Solution { &nbs...原创 2019-08-21 12:10:23 · 105 阅读 · 0 评论 -
面试题18.删除重复节点
题目描述:在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解析:新建一个头结点,从头开始遍历链表,若当前节点与下一个节点的值相同,则它们是重复节点,都需要删除。此时要把当前节点的前节点(preNoode)与当前节点的下一个节...原创 2019-08-21 11:00:31 · 157 阅读 · 0 评论 -
47.不用加减乘除做加法
题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。解析:位运算Java代码实现:public class Solution { public int Add(int num1,int num2) {//利用位运算 while(nu...原创 2019-08-12 11:58:10 · 72 阅读 · 0 评论 -
面试题.矩形覆盖
题目描述:我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?解析:将n2的矩形记为f(n)。用第一个21的小矩形去覆盖大矩形的时候有两种选择:竖着去放或者横着去放,当竖着放的时候,右边还剩下(n-1)2的矩形区域,此情况下的覆盖方法为f(n-1)。当21的矩形横着放在左上角的时候,左下角必须横着放一个21的小矩形,而在右边...原创 2019-08-14 21:34:50 · 189 阅读 · 0 评论 -
面试题.青蛙跳台阶(1级或2级)
题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。解析:若只有1级台阶,只有一种跳法;若有2级台阶,则有两种跳法:一次跳一级,一次条两级。对于一般情况:将n看作n的函数f(n),当n>2时,第一次跳就有两种不同的选择:一次是第一次只跳一级,此时跳法数目等于后面剩余的n-1级台阶跳法数目:f(n-1)。二是第一次...原创 2019-08-14 17:58:27 · 759 阅读 · 0 评论 -
面试题8.二叉树的下一个节点
题目描述:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。解析:1.如果节点有右子树,那么他的下一个节点就是他的右子树中的最左子节点。2.如果没有右子树,若节点是它父节点的左子节点,那么他的下一个节点就是它的父节点。3.如果一个节点既没有右子树并且他还是父节点的右子节点。那么需要一直向上遍历直到找到一个是它父...原创 2019-08-14 14:54:38 · 93 阅读 · 0 评论 -
15.调整数组顺序使奇数位于偶数前面
**题目描述:**输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。Java代码实现:public class Solution { public void reOrderArray(int [] array) { ...原创 2019-06-24 10:43:04 · 84 阅读 · 0 评论 -
面试题25.合并两个排序的链表
解题思路:链表的合并过程,从两个链表的头节点开始。假设链表1为(1,3, 5, 7,9),链表2为(2,4,6,8,10)。链表1的头节点值小于链表2的头节点值,因此链表1的头节点将会是合并后的链表的头节点,现在链表1为(3,5,7,9),链表2为(2,4,6,8,10)。然后再比较链表1的头节点和链表2的头节点,此时链表2的头节点小于链表1的头节点。如此继续进行下去,这是一个递归过程。java...原创 2019-06-18 18:44:45 · 226 阅读 · 0 评论 -
16.题目描述:输入一个链表,反转链表后,输出新链表的表头。
解题思路:使用两个指针,然后反向输出节点public class Solution { public ListNode ReverseList(ListNode head) { if(head == null){ ...原创 2019-06-18 17:13:37 · 383 阅读 · 0 评论 -
15.题目描述:输入一个链表,输出该链表中倒数第k个结点。
解题思路:利用两个指针一次遍历列表,第一个指针从链表的头指针开始遍历向前走k-1步,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个指针(快指针)到达链表的尾部时,第二个指针(慢指针)正好是倒数第k个节点,即两个指针刚好相差k步。假设上面6个节点的链表倒数第3个个节点为所求节点,首先fast指针从表头开始向前走3-1=2步到达第...原创 2019-06-18 15:41:56 · 147 阅读 · 0 评论 -
8.题目:旋转数组中的最小数字
利用二分查找法Java代码实现:import java.util.ArrayList;public class Solution { public int minNumberInRotateArray(int [] array) { if(array == null |...原创 2019-06-16 12:12:47 · 73 阅读 · 0 评论 -
7.题目描述:用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。
首先需要明确栈和队列的特性,栈的特点是先进后出,即最后被压入(push)栈的元素会第一个被弹出(pop);队列的特点是先进先出,即第一个进入队列元素将会第一个出来。本体的思路是:将元素全部压入(push)stack1中,此时stack2为空;元素全部压入完毕,将stack1中的元素弹出(pop)并将其压入(push)stack2中,全部压入(push)完毕,将stack2中的元素取出。Java代...原创 2019-06-16 10:16:31 · 668 阅读 · 0 评论 -
剑指offer刷题
5.题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。根据栈后进先出的特性,打印链表。Java代码实现:import java.util.*;public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ...原创 2019-06-09 17:13:38 · 59 阅读 · 0 评论 -
11.题目描述:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
考虑输入值的多种情况,两个数的相等不能使用==来比较,因为浮点数存在误差java代码实现:public class Solution { public double Power(double base, int exponent) { double res = 0;&n...原创 2019-06-13 10:19:54 · 237 阅读 · 0 评论 -
23.从上往下打印二叉树
题目描述:从上往下打印出二叉树的每个节点,同层节点从左至右打印思路:从根节点开始打印,从上到下打印二叉树,利用队列先进先出(FIFO)的性质Java代码实现:import java.util.ArrayList;import java.util.LinkedList;public class Solution { public ArrayList&...翻译 2019-07-08 20:38:32 · 57 阅读 · 0 评论 -
25.二叉树中和为某一值的路径
题目描述:输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)Java代码:import java.util.ArrayList;import java.util.*;public class Solution { ...原创 2019-07-08 20:50:41 · 114 阅读 · 0 评论 -
7.重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。***解析:前序遍历第一个数字就是根节点,即1是根节点。所以在中序序列中1往前的是左子树节点,1往后的序列是右子树节点。***前序遍历左子重建i的范...原创 2019-08-14 11:18:38 · 108 阅读 · 0 评论 -
5.从尾到头打印链表
题目描述:输入一个链表,按链表值从尾到头的顺序返回一个ArrayList。解析:将链表从尾到头打印,很容易想到栈的先进后出特点Java代码实现:import java.util.*;import java.util.ArrayList;public class Solution { public ArrayList<Integer> printListFromTai...原创 2019-08-09 16:49:14 · 107 阅读 · 0 评论 -
3.二维数组中的查找
题目描述:在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。解析:取二维数组的右上方的顶点与要找的数字比较,如果要找的数字比顶点的数字小,那么舍弃该列(column),如果要找的数字比顶点大,则舍弃该数字所在的行(row),若相等则跳出。public ...原创 2019-08-09 15:27:41 · 99 阅读 · 0 评论 -
4.替换空格
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy解析:使用动态型字符串StringBuilder/StringBuffer,好处是长度可变,允许扩充Java代码实现:import java.util.*;public class Solution { &nbs...原创 2019-08-09 15:19:38 · 120 阅读 · 0 评论 -
面试题3.数组中重复的数字
题目描述:在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。解析:数组的第0个数字(从0开始计数,和数组的下标保持一致)是2,与它的下标不等。于是把他和下标为2...原创 2019-08-13 16:59:42 · 129 阅读 · 0 评论 -
31.连续子数组的最大和
题目描述:HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序...原创 2019-08-06 14:51:18 · 109 阅读 · 0 评论