剑指offer
剑指offer最后68题,刷完就开始面试,祝我好运
第一遍用golang刷过去,第二遍用java刷回来,刷两遍保证自己不忘。哈哈哈哈
不穿鞋的猫丶
这个作者很懒,什么都没留下…
展开
-
汉诺塔
完全的采用了递归思想。我要移动第n个,那么首先将n-1个给放到辅助柱子上,接着把要移动的那个放到目的柱子上,再将辅助柱子上的也放到目的柱子上...原创 2020-04-08 10:16:36 · 77 阅读 · 0 评论 -
36.二叉搜索树与双向链表
由于是二叉搜索树,所以root的左节点小于root,root的右节点大于root,我们通过中序遍历时就是从小到大的顺序,然后在中序遍历的过程中更改节点指针的指向就行了代码如下: ...原创 2020-04-02 19:47:23 · 66 阅读 · 0 评论 -
25.复杂链表的复制
其实这道题有点没看懂啥意思代码如下:原创 2020-04-02 16:55:47 · 69 阅读 · 0 评论 -
二进制中1的个数
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。原创 2020-03-18 23:24:16 · 84 阅读 · 0 评论 -
矩形覆盖
代码:原创 2020-03-18 23:14:07 · 69 阅读 · 0 评论 -
39.数组中出现次数超过一半的数字
这道题第一次由于太简单就没写博客,因为那次直接用的排序去中间值的做法,今天倒刷到这里时去看了下题解发现有一个波尔投票法,效率快了很多,只需要O(n)的时间复杂度就行了 代码如下: ...原创 2020-03-04 15:07:39 · 69 阅读 · 0 评论 -
45.把数组排成最小的数
这道题好像原来第一遍做的时候没有做,也不知道是忘记了还是什么原因,第二次重刷剑指offer时才发现没做,所以也就没有golang版本了,直接就是java版本的 要想把数组排成最小的数,我们先对对数组中的数进行一个转换也就是String.valueOf()放进一个list中,然后自己去定义比较函数,两个字符串s1,s2比较s1+s2和s2+s1的大小,出现s1+s2>s2+...原创 2020-03-04 13:39:16 · 90 阅读 · 0 评论 -
55.1---二叉树的深度
突然发现这道题没有写题解,这次第二遍回来做顺便写一下。第一遍都是用的golang,第二遍我就开始用java来找回点java刷题的感觉,每天复习20题,剑指offer+LeetCode100一共160题左右大概8天时间复习完,正好阿里实习招聘开始,刚刚合适。加油加油加油。 代码如下: ...原创 2020-03-03 15:01:00 · 97 阅读 · 0 评论 -
56.2----数组中数字出现的次数2
回来补一道题,只不过这次是用java来做的,这里依然是位运算。代码如下:原创 2020-03-03 14:04:21 · 131 阅读 · 0 评论 -
68.1————二叉搜索树的最近公共祖先节点
唯一的不同就是这里是二叉搜索树,既然是二叉搜索树,那么比二叉树更加地简单了,因为二叉搜索树的左节点一定比根节点小,右节点一定比根节点大代码如下:...原创 2020-03-02 14:51:03 · 102 阅读 · 0 评论 -
68.2-------二叉树的最近祖先节点
这道题以前在LeetCode中做过,不过那次是用golang做的,这次换成java来做代码如下:原创 2020-03-02 14:13:53 · 71 阅读 · 0 评论 -
67.把字符串转换成整数
这道题,,除了细节,还是细节,一定要注意细节,。。。稍不注意就要出错。。。我已经改那些小细节把自己改懵逼了。。。代码如下:原创 2020-03-02 13:14:40 · 59 阅读 · 0 评论 -
66.不用加减乘除做加法
额。。这道题,确实我不会,,,对于位运算,我有点不熟。跟着一个题解慢慢了解位运算把。二进制运算规则和十进制是差不多的,只不过十进制遇10进位,而二进制遇2进位,并且二进制进位后保留的余数是0.二进制的计算是这样的:1.计算不进位的和,也就是用异或来进行计算^ (异或也就是对应位的数不同则为1,相同则为0)2.计算进位,也就是先求与&,在左移一位3.计算a+b,...原创 2020-03-02 11:48:01 · 82 阅读 · 0 评论 -
63.股票的最大利润
这道题做过两遍了,在LeetCode里面,前面两次都是用的动态规划做的,这一次没有用动态规划,因为这个只能买卖一次,那么我们每次卖的的时候要和前面的最低买入价格进行对比,如果相减的价格大于最大值时则更新max代码如下:...原创 2020-03-02 11:18:45 · 93 阅读 · 0 评论 -
62.圆圈中最后剩下的数字
能想到的就是用一个链表来做这道题,将这些数都放进一个链表中,然后移动,移动到对应数的时候就进行删除,我直接用的java里面的list来做的,可以list.remove()删除某个节点,这里要注意的是,删除也是从第0开始算的,而不是1.还有一个关键是找到每m个数删除一个节点,这里不超出链表最大size的方法就是 (t+m-1)%list.size(),通过求模控制范围一直在n里面。代码如下:...原创 2020-03-02 10:25:15 · 79 阅读 · 0 评论 -
61.扑克牌中的顺子
这道题就是把给定的5个数字,看是否能够是连续不间断的数字,不过这道题不一样的大王小王可以做任意数,所以我们先要统计出是否有大王小王,然后再统计剩下的数间断数的数量是否小于任意数的数量,如果小于等于的话,那么就可以,否则不行。由于以前刷题用惯了golang,现在用java刷经常忘记加上分号。。if语句也经常忘记加上括号。。。代码如下:...原创 2020-03-02 10:01:11 · 117 阅读 · 0 评论 -
60.n个骰子的点数
这道题最初在看LeetCode上解法,结果越看越迷糊,,不知道为啥总觉得剑指offer书上的解法都不是很好,而且也不是很好理解,还是网友的解法看着更加地舒服。最舒服的解法还是动态规划了,当骰子为n个时,那个此时的和s的情况为骰子为n-1时的情况再加上目前的s减去当前骰子的点数。这就是状态转移方程,找到就好办了,代码如下:不过这里要注意最后统计的时候用的res[i-n],只有这样才能让r...原创 2020-03-01 22:15:16 · 140 阅读 · 0 评论 -
59.2----队列的最大值
实现一个函数max能够得到队列里的最大值,并且时间复杂度为O(1)很熟悉,以前做过两个栈实现一个栈的min,max函数的,这道题变成了队列所以,这里也能够有相似的思想,我们能不能两个双端队列实现这个的max函数呢?答案是可以的。不过,,,deque的一些方法我实现是有点记混了,所以在做这道题时想不起来哪个方法是什么意思,这里先贴上ArrayDeque的用法吧:然后就好做这道题...原创 2020-03-01 21:09:18 · 83 阅读 · 0 评论 -
59.滑动窗口的最大值
4个小时才算大致把这道题给搞明白了。。。前面一直被卡着就是想不通。首先定义了一个双向链表来存储放入值的数组下标,注意!是数组下标,不是这个数!因为后面要通过下标和滑动窗口的大小的和来判断首元素该不该从链表头部移除,其实窗口的滑动就是首元素的移除和尾元素的进入。这里要注意的是,假如新进来的数比尾元素大,则要移除尾元素,知道新的尾元素比即将进来的值大或者链表为空才停止,因为假如不移除的话,那么新元...原创 2020-03-01 20:17:22 · 97 阅读 · 0 评论 -
58.左旋转字符串
转java来写了,目前感觉golang的语法都已经差不多熟悉了,而对于字符串操作golang确实有一丢丢麻烦,并且原来打算用go写的原因就是去面试时让面试官知道我还会go。现在不用了,因为原来只想到了字节跳动一家公司,现在就想多投,把大厂都给投一遍,我本人也更加熟悉java,今后就java刷题啦。首先是第一种解法,直接substring():不过面试的话可能更想要我们的思路是反转...原创 2020-03-01 15:36:34 · 104 阅读 · 0 评论 -
57.和为s的连续正数序列
二刷该题用的java做法:如果没有限制返回的必须是二维数组的话,这道题好做得做,直接来一个ArrayList不知道多方便,无语哦原创 2020-02-29 17:19:47 · 85 阅读 · 0 评论 -
57.和为s的两个数字
双指针法,一个指向开始,一个指向数组的末尾,然后开始比较,假如和与目标相等,返回两个值,假如和小于目标值,left++,假如和大于目标值,right--代码如下:我其实最初想到的是map来做,不过map在这里好像还要慢一些,并且增加了空间复杂度...原创 2020-02-29 16:26:53 · 79 阅读 · 0 评论 -
56.1-数组中数字出现的次数
这道题用到了异或,也是我第一次真正接触异或这个东西,虽然LeetCode前面有道题只求出现一次,但是那次我用的map,刚刚回去也改成了用异或来做,确实方便。异或就是一个数与它本身异或一定是0,任何数与0进行异或结果就是任何数。所以以前那道题就一直异或下去就行了,因为相同的数都变成了0消掉了,剩下的那一位就是只出现一次的那位然后就是这道题,这道题比较麻烦,有两个数只出现了一次,我也还不是太理解这...原创 2020-02-29 16:02:06 · 86 阅读 · 0 评论 -
55.平衡二叉树
比上一道题多了一个条件,左右子树的高度差不能超过1.解决方法依然是递归,假如子树满足平衡二叉树的条件,返回其中较大的高度+1,不满足,直接返回-1.最后通过判断结果是否为-1来判断是否是平衡二叉树代码如下:...原创 2020-02-29 15:21:43 · 118 阅读 · 0 评论 -
54.二叉树搜索树的第k大节点
以前一直用的都是中序遍历的正常模式,就是左根右,这一次居然是左右根,从来没想到这么用过,这道题提醒我了。就是设置一个全局count,当count为1时,说明当前节点就是目标节点,返回值就行,这里要注意的是返回值的时候count依然要减1,不然的话对于递归的上一层来说count还是等于1就依然会更新res的值,代码如下:...原创 2020-02-29 14:48:24 · 192 阅读 · 0 评论 -
53.2---0~n-1中缺失的数字
因为是按照顺序来的,采用二分法查找,如果num[mid] != mid时,说明mid的前面已经出现了缺失,但是我们不知道mid是不是就是缺失的那一个,所以right=mid,当num[mid]==mid 时,说明到当前位置都是没有缺失的,是从mid+1后才开始出现缺失,所以left=mid+1。最后当left==right时,就能够找到缺失的数了,代码如下:...原创 2020-02-29 14:19:54 · 120 阅读 · 0 评论 -
53.在排序数组中查找目标元素的出现次数
LeetCode原题,改了下返回值,第一次做的时候直接在一个函数里解决的,因为传入了一个判断参数来判断是求最左边还是最右边,这次分两次来求该元素在最左边出现的位置和最右边出现的位置,其实两种是一样的代码如下:...原创 2020-02-29 13:46:17 · 140 阅读 · 0 评论 -
52.两个链表的第一个公共交点
LeetCode有原题,前面做过代码如下:原创 2020-02-29 13:10:18 · 83 阅读 · 0 评论 -
51.数组中的逆序对
剑指offer上的一道题,在LeetCode上算困难的题。对我来说确实困难,看了别人的题解稍微有点明白,但还是没有彻底明白,先将这道题的题解写下来吧,后面再慢慢理解,确实有点理解不了。。...原创 2020-02-29 12:39:33 · 72 阅读 · 0 评论 -
50.第一个只出现一次的字符
因为字符一个有26个,所以可以开一个数组, 遍历字符串时,在对应的数组进行加1,遍历完成后再遍历一次字符串,发现出现次数为1时就是答案,可以返回代码如下:...原创 2020-02-28 13:25:46 · 52 阅读 · 0 评论 -
49.丑数
判断一个数是不是丑数,只需要判断是否除了2,3,5以外,还包含其他的因子,如果不包含,则是整数这道题为了避免重复的判断,用到了动态规划。不过,如果我们算了该数乘2是丑数后,还要判断乘3是不是丑数,后面还要判断乘5,也就是同时要更新2,3,5指针的值。不然后面会出现重复计算...原创 2020-02-28 13:05:09 · 95 阅读 · 0 评论 -
48.最长不含重复字符的子串
LeetCode的第3题,也是我最初开始刷LeetCode给我造成最大暴击的一道题。。当时确实想了好久好久,然后才看懂那个题解。这一次又碰到了,主要就是滑动窗口,在我做了这么多题后,发现滑动窗口其实就是动态规划。而且,这一次的解决方式比前面那次做的思路更加的清晰。主要就是在更新start时,要判断start和map中的那个value的大小,不然可能会更新回去。代码如下:...原创 2020-02-28 11:30:39 · 140 阅读 · 0 评论 -
47.礼物的最大价值
和LeetCode的那道机器人走路的类型很像依然是用动态规划,不过这里要注意的是机器人那道的第一行第一列都只有一种走法,所以下标是从1开始的,而这里是计算礼物的最大数量,还是从0开始。并且当为第一行或第一列时,上面或左面是没有值的,这个时候还要判断一下代码如下:...原创 2020-02-28 11:08:48 · 92 阅读 · 0 评论 -
46.把数字翻译成字符串
LeetCode里面的青蛙跳台阶做过这道题,用到了strconv.ItoA函数代码如下:原创 2020-02-28 10:44:49 · 65 阅读 · 0 评论 -
44.数字序列中某一位的数字
感觉这连续的几道题都是找规律那种,,有点做着不是很舒服。。。就是那种想到了就做出来来,想不到就做不出来那种。。。代码如下:原创 2020-02-28 10:21:09 · 89 阅读 · 0 评论 -
42.连续子数组的最大和
也是LeetCode原题,第一次做过,不过那么没有用动态规划,这次用上了动态规划,就很开心代码如下:原创 2020-02-28 09:54:24 · 82 阅读 · 0 评论 -
40.最小的k个数
如果采用map来做,很简单,前面的LeetCode也做过这道题。不过剑指offer提到这道题还可以用partition来做,所以我想试一下,没想到一试依然试了半个小时,,而且。。而且。。错误原因奇葩到家了,,这道题k可以为0,,,而我,,忘记了这种情况,所以,当k为0的时候,就会超时,我一直没发现。。。。我也是哭了。。。...原创 2020-02-27 16:47:07 · 122 阅读 · 0 评论 -
38.字符串的排列
原来在LeetCode上做了一道类似的题,不过那道是数字,这里变成了字符串,而字符串转byte我还有点不熟悉,正好借这道题熟悉了一下。具体思路是差不多的,用回溯,假如最后的byte数组的长度等于s的长度,那么就是一种结果,我们用了一个map来存储。如果小于s的长度的话,则继续为了避免出现重复的字符时重复计算,这里也是靠的map来进行了去重。然后当要用到当前的字符时,设置那个boo...原创 2020-02-27 15:22:44 · 90 阅读 · 0 评论 -
34.二叉树中和为某一值的路径
这道题通过递归来做我们只要每次遍历到叶子结点判断从root到叶子结点路径上所有节点的值的和是不是等于目标值就行了。但是,,,,又是一个golang的问题,把我整了好久,最好看题解才看明白。。。如果你想把一个slice直接给另一个以slice为元素的数组加进去时,,请复制一份再开始用,不然你会发现得到一些错误的而且看不懂的错误。我就是,明明思路都对,用手都推了一遍,我觉得还是对,但是结果就是...原创 2020-02-27 13:47:11 · 105 阅读 · 0 评论 -
33.二叉搜索树的后序遍历
平时我们都是通过给定的二叉树然后找到它的后序遍历,这里是给你一个数组,让你判断是不是一棵树的后序遍历,确实很新颖,至少我从前没有碰到过这道题。那么,这里该怎么办呢?还是根据后序遍历的特点来,后序遍历的最后一个数一定是根元素,因为后序遍历是按照左右根的顺序来遍历的。又因为这里是二叉搜索树,所以比根小的的都在左边,大的都在右边,我们需要先找出所有左节点,然后是右节点,在找右节点的时候,假如出现了一个数...原创 2020-02-27 13:04:40 · 100 阅读 · 0 评论