自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 中:链表指定区间反转

题目描述 将一个链表m位置到n位置之间的区间反转。 例如: 给出的链表为1→2→3→4→5→NULL,2,4 返回1→4→3→2→5→NULL. 注意: 给出的mn满足以下条件: 1≤m≤n≤链表长度 解: 这道题的难度在于边界值的判断,因为特定区间就容易产生越界。这道题简单,所以辅助空间和时间要控制尽量小,所以采用重指向而不新建链表,区间头尾重链接时注意碰到1和length的问题,其它的直接反转即可。你可以从任意一边连接。 import java.util.*; /* * public cl

2020-08-31 23:54:26 588

原创 美团:删除倒数第n个节点

题目描述 给定一个链表,删除链表的倒数第n个节点并返回链表的头指针 例如, 给出的链表为:1->2->3->4->5, n= 2. 删除了链表的倒数第n个节点之后,链表变为1->2->3->5. 备注: 题目保证n一定是有效的 请给出请给出时间复杂度为\ O(n)O(n)的算法 解: 首先链表是单向的,所以想要直接删除可以反转后删除再反转回来,但是效率过低,所以我们采用数学方法。倒数第n个,也就是正序(length-n+1),所以我们只需要一次遍.

2020-08-30 23:02:17 110

原创 简:变化二分查找

题目描述 请实现有重复数字的有序数组的二分查找。输出在数组中第一个大于等于查找值的位置,如果数组中不存在这样的数,则输出数组长度加一。 解: 这道题考察的其实是变换了终止条件的二分查找,所以在条件上要是第一个>=value的值才满足,而且要注意边界。详见代码: import java.util.*; public class Solution { /** * 二分查找 * @param n int整型 数组长度 * @param v int整型 查找

2020-08-29 16:34:02 306

原创 较:翻转字符串单词顺序

题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么? 解: 这种题第一个思路是利用String.split(' '),直接返回多个字符串,再利用StringBuffer拼接也是很快的。

2020-08-25 17:28:56 102

原创 简:字符串旋转

题目描述 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它! 解: 这道题用选择法,新数组存储旋转后数组即可,辅助空间O(n),时间上也是O(n)。String中Java有一个截取的函数,就不需要我们转换成字符数组进行选择了。 public class Solu

2020-08-25 17:00:20 89

原创 较:链表删除重复元素

题目描述 在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 解: 这道题首先要注意,重复元素一个不留,且开头元素可能重复,所以如果我们直接在原链表上操作会比较麻烦。这里采用选择节点构建新链表的方式进行删除。如果重复,直接划过,不重复就插入到新链表中。 /* public class ListNode { int val

2020-08-24 17:34:12 163

原创 中:数组中的任一重复数字

题目描述 在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。 解: 这道题我们直接用数组下标标记出现的值,查重即可,这里使用HashSet代替数组,因为我们不需要知道下标这些。而且这道题如果是找出第一个重复数字也是正确的。 import java.util.HashSet; publ

2020-08-24 16:59:41 108

原创 中:链表的环

题目描述 给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。 解: 这道题如果用O(n2)做法,可以直接根据每个节点是否能回到本节点或是末尾来判断环入口,代码也较为简洁,当然你需要从链表尾部倒着开始,否则会死循环。 这里介绍一种比较巧妙的做法,可以在O(n)时间内完成。我们根据以往的“操场追赶”经验,速度快的总是能在环里追上速度慢的,而如果不存在环,那么速度快的会直接跑到终点,而非相遇。所以我们只需要设置一个快节点,一个慢节点,每次快一步,如果有环就会相遇。那么环入口就需要计

2020-08-23 18:59:28 102

原创 较:数组排成最小的数

题目描述 输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。 解: 这道题其实用贪心算法就能做,但是问题在于我们怎么选出那个“当前数组使得值最小的number”。第一种方法,我们把每一个number转换成一个字符数组,选择出第一个数字(如果相同往后推)最小的那个,于是每次都选择当前最小,达到整体最小。但是这个算法一来开销大,你得有O(n)的辅助空间,时间开销上是O(n),而且这

2020-08-22 16:48:04 81

原创 中:非重复数字的获得

题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。 解: 其实这道题就算不是两个数字也是可以做的,即只要重复次数为偶数就好做,因为我们可以偶数“消去”,即未重复保存,重复的直接消掉,最后剩下的肯定是非重复的。一般我们采用Map来做为标记,因为Map的key查找效率很高,但是这道题我们直接用HashSet做就可以了,因为我们不需要保存数值对应的次数。这样我们可以控制在O(n)时间内完成,千万不要用数组,手动去查找,(用数组下标也能做,但是你不确定数值有

2020-08-22 16:00:31 100

原创 中:二维数组查找

题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。 解: 这道题可以直接用for暴力循环来做,但是不确定时间会不会超时。我也考虑过有序集用双重二分查找,但是这种查找需要纵列配合,跳跃效果也不明显。所以我用的是数学规律做的,每一个矩阵中,array[i][i]肯定是最大的,所以我们可以直接让target与array[i][i]比较,小于就跳过,大于就进入

2020-08-21 18:23:09 113

原创 中:shopee真题的走办公室

题: shopee的办公室非常大,小虾同学的位置坐落在右上角,而大门却在左下角,可以把所有位置抽象为一个网格(门口的坐标为0,0),小虾同学很聪明,每次只向上,或者向右走,因为这样最容易接近目的地,但是小虾同学不想让自己的boss们看到自己经常在他们面前出没,或者迟到被发现。他决定研究一下如果他不通过boss们的位置,他可以有多少种走法? 解: 这道题我使用的是数组标记法,即利用一个辅助空间存储已经走过的表格,然后达到查找树剪枝的效果。当然也可以用DP,这也是很经典的解法,因为每一个表格的走法就是va

2020-08-21 16:29:19 108

原创 中:统计数字区间1出现的次数

题目描述 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。 解: 这道题我们首先可以大概猜测出,1出现的次数跟位数有关。如果用位数直接对应有些麻烦,比如十位上的n(>1),会出现n+9次,但是n为百位,千位......上时规律比较难以

2020-08-18 22:08:38 368

原创 中:连续子数组的最大和

题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) 解: 这道题可以用DP来做,因为组合问题往往就是具有相

2020-08-18 11:41:54 88

原创 中:数组的重复数字

题目描述 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 解: 这道题可以直接用数组下标法做,用一个辅助数组来存储数字的出现次数,然后可以直接判断次数。那么需要的时间和空间均为O(n)。 public class Solution { public int MoreThanHalfNum_Solution(int [] arra

2020-08-17 23:07:20 130

原创 中:栈的序列判断

题目描述 输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的) 解: 这道题我们根据pop序列对push操作,按照“先进后出”原则,如果没有错误操作说明序列可完成。那么我们每一次pop只需要查看是否未入栈,或者是否为已入栈的第一个元素(注意栈空问题,因为给

2020-08-17 11:56:43 424

原创 中:重建二叉树

题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 解: 这道题我尝试过用递归,太过复杂了,一堆指针操作。后来看到有人用递归轻松解决,所以这里简单记录一下递归的做法,(如果不是内存限制,一般推荐用递归,迭代不是不好,而是太难写易出错)。 首先我们找出每个节点的共性,把每个节点看成一棵树的根节点,然后在本树的

2020-08-14 18:11:12 124

原创 中:反转链表

题目描述 输入一个链表,反转链表后,输出新链表的表头。 解: 这道题直接利用指针将节点断开,然后重指向即可。注意,原始head.next=null,不然校验的时候会死循环。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public class Solution { public Lis

2020-08-14 16:50:18 81

原创 中:链表合并

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。 解: 这道题两个链表已经是有序的,我们可以直接使用“类选择排序”,这样可以在O(n)时间内完成,同时不需要增加额外的辅助空间。 /* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; } }*/ public cl

2020-08-13 22:09:47 75

原创 中:旋转数组最小值

题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。 解: 我们把旋转数组看成一个环形数组,首尾相连,只不过缺失了首尾的连接而已。那么原数组的头在“环形数组”中就是那个最小值,而且它的尾就是最大值,且head=(tail+1)%length,所以我们只要找出那个arra

2020-08-12 16:14:40 192

原创 中:斐波那契数列

题目描述 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。 n<=39 解: 斐波那契数列递推式:f(n)=f(n-1)+f(n-2),n>=2。显然用递归+数组下标标记法,这里要注意的问题是边界,注意不要越界即可。 public class Solution { private int[] a; public int digui(int n){ if(n==0)

2020-08-12 15:56:48 131

原创 中:矩形覆盖

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?比如n=3时,2*3的矩形块有3种覆盖方法:(图片来自牛客网) 解: 这道题一开始以为是图形话的,也就是二维,但是仔细一看,其实就只有一维,因为每一次要么是1,要么是2,所以相当于用1或2去填充n。所以这道题很经典的,可以运用递归+数组下标标记法。之前写过类似的博客了,青蛙跳台阶那个,这里就不赘述了。 public class Solution {

2020-08-11 21:17:53 114

原创 中:统计整数二进制1的个数

题目描述 输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。 解: 这道题没什么难度,主要是补码的使用。一般我们是先转正数原码,然后取反再加1。这里介绍一个比较方便的算法,即将正数原码扫描,遇到第一个1不操作,此后每一个数都取反(包括符号位,注意是从右往左)。当然,你也可以先把符号位设定好。 public class Solution { public int NumberOf1(int n) { int[] a=new int[32];

2020-08-11 20:36:18 126

原创 小记:mongoDB安装时的问题

这里推荐一篇简单易懂的安装博客 传送门 1.千万不要安装用户界面,也就是custom后默认勾选的compass,因为你不知道多久才能安装完--微笑--然后就只能强行中止再安装。 --this one,千万不要勾选 2.一个Windows用户可能会遇到的问题,就是mongoDB无法完成服务注册,或者说就算你注册了,还是会无法正常响应mongo服务,如果你也遇到下面问题,请按照下面步骤处理试试: 1.以管理员身份打开cmd 2.sc delete MongoDB //删除原有的服务 3.外

2020-08-10 15:23:23 116

原创 中:字符流中第一个不重复的字符

题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。 解: 1.我们需要一个接收字符流的函数,然后还有一个处理的函数,那么我们需要变量用于数据传送。所以首先我们需要一个字符数组或者字符串,考虑到数组的定长,字符流的字数不确定,还是考虑字符串。 2.关于处理,显然最简单的就是根据“数组下标标记法”来做,即我们利用特定字符作为数组下标,

2020-08-09 21:49:06 136

原创 中:跳台阶

题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。 解: 这个跟青蛙跳台阶是一样的,区别就在于只能跳一级或二级而已。 青蛙跳台阶传送门 public class Solution { private int[] sum; private int jump(int n){ if(sum[n]!=0) return sum[n]; if(n>=2

2020-08-07 18:14:29 85

原创 简:二叉树的镜像

题目 操作给定的二叉树,将其变换为源二叉树的镜像。 解 其实也就是左变右,右变左。好像也没什么好优化的...... /** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class Solution {

2020-08-07 17:52:28 65

原创 简:青蛙跳台阶问题

题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。 解: 这道题显然使用搜索树进行查询,所以我们考虑递归的效率问题。这道题目中可以从每次跳一阶递增至直接跳完开始查找,也可以从直接跳完然后递减至跳一阶查找,看自己习惯。全局搜索显然太浪费时间,因为这里只有阶数限制,并没有其它要求,所以我们每算出一个答案就可以保存下来,提供给往后相同阶数搜索时直接得出结果。选择从简单(递减序)开始算起,因为算出了1阶的跳法,到时2阶就能直接用,然后3阶

2020-08-07 00:02:55 119

原创 简:用两个栈实现队列

一开始看到这个题确实有点奇怪,栈来实现队列?这两个数据结构刚好相反,确实有点奇怪,如果两个栈共用一个内存,A的栈顶为B的栈底,那就可以利用A的进栈实现队列进队,B的出栈实现队列出队,但是题目已经帮我们把内存分配好了,没得手动分配内存,那就没得让自己设计一个“类似队列”了。 那么A进栈后1号元素被压到栈底了,没办法,只能先全部pop到B栈中实现队列正序,然后B栈pop1号元素返回,再pop回A栈中,回到原本A中的倒序。 import java.util.Stack; public class Solu

2020-08-06 00:04:55 75

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除