刷14道leetcode的总结
引子
1,目标很重要
2,专注很有力量
3,比起「有所为」、「有所不为」更为关键
1,我不去面试,但是我有可能面试别人。别人在写算法的时候,我需要有思考才不至于用来面试别人的时间对自己没有成长。也是对面试者的负责。
2,刷leetcode,我用的是go语言。工作中暂时还没用。但是我是做容器的,迟早是要用的,提前熟悉起来。
3,算是对之前包括大学四年的一个回顾总结,将之前的一些知识体系化
结果
过程
1,两数之和
题目大意
给定一个目标值,要在一个给定数组中找到两个数,它们的和为目标值。
解题思路
使用map的数据结构,遍历过程中找到从map中取出值为目标值减去当前值的数。
详情可参考:
https://leetcode-cn.com/problems/two-sum/solution/liang-shu-zhi-he-gojie-fa-by-xie-xiao-jing/
知识点
数据结构->哈希表
2,整数回文数
题目大意
判断一个整数是回文数是指从左到右和从右到左读到的内容是一致的
解题思路
将整数转为数组,利用数组。将整数分为一个byte数组。遍历数组的一半。从左开始的和从右开始的相对位置一样的数字都应该是一样就是回文数,否则就不是回文数。
详情可参考:
https://leetcode-cn.com/problems/palindrome-number/solution/hui-wen-shu-gojie-fa-by-xie-xiao-jing/
知识点
数据结构->数组
3,罗马数字转为整数
题目大意
因为了解罗马数字也是一种知识,所以我把完整的题目写下来。
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。27 写做 XXVII, 即为 XX + V + II 。
通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:
I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给定一个罗马数字,将其转换成整数。输入确保在 1 到 3999 的范围内。
解题思路
将所有字母的组合存入哈希表,遍历时先判断是否是双字母的,不是再判断是否是单字母的。
详情可参考:
https://leetcode-cn.com/problems/roman-to-integer/solution/luo-ma-shu-zi-zhuan-zheng-shu-gojie-fa-by-xie-xiao/
知识点
数据结构->哈希表
4,最后一个单词的长度
题目大意
给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。
解题思路
这道题对于经常写业务代码的同学来说可能很简单,因为看懂题了,运用类库就做出来了。这道题可以归结为字符串数组的使用。
详情可参考:
https://leetcode-cn.com/problems/length-of-last-word/solution/zui-hou-yi-ge-dan-ci-de-chang-du-gojie-fa-by-xie-x/
知识点
数据结构->数组
5,报数
题目大意
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。
解题思路
使用两个数组,一个存放当前的整数序列中所有的数值,另一个存放每个字符出现的个数。打印的时候打印一个数组,再打印对应的个数就得到一个新数。如果还有下一个,重复此过程。
详情可参考:
https://leetcode-cn.com/problems/count-and-say/solution/bao-shu-gojie-fa-by-xie-xiao-jing/
知识点
数据结构->数组
6,整数转罗马数字
题目大意
与题目「罗马数字转为整数」相反,给定一个整数,将其转为罗马数字。输入确保在 1 到 3999 的范围内。
解题思路
贪心算法,每次选择局部最优
详情可参考:
https://leetcode-cn.com/problems/integer-to-roman/solution/zheng-shu-zhuan-luo-ma-shu-zi-goliang-chong-jie-fa/
知识点
基础算法->贪心算法
7,最长公共前缀
题目大意
编写一个函数来查找字符串数组中的最长公共前缀。如果不存在公共前缀,返回空字符串 “"
解题思路
可以将这个字符串数组转成单个字符的二维数组遍历。也可以采用分治法,直到分解成两个字符串比较。
详情可参考:
https://leetcode-cn.com/problems/longest-common-prefix/solution/zui-chang-gong-gong-qian-zhui-goliang-chong-jie-fa/
知识点
数据结构->二维数组
基础算法->分治法
8,字符串的最大公因子
题目大意
给定两个字符串A和B,求最大公因子
解题思路
最大公因子存在的充要条件A+B=B+A。判断存在公因子,则公因子的长度不大于(A长度-B长度绝对值,为新的A)与B长度的最小值。循环直到A的长度等于B的长度。
知识点
基础算法->最大公约数算法
详情可参考:
https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-gojie-fa-by-xie-/
9,删除排序数组中的重复项
题目大意
给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。
解题思路
放置两个指针 slow和 fast,其中slow是慢指针,而fast是快指针。只要 nums[slow]等于nums[fast],就删除此元素。否则让slow=fast继续遍历。
详情可参考:
https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-xiang-goj/
知识点
基础算法->双指针法
10,压缩字符串
题目大意
给定一组字符,使用原地算法将其压缩。压缩后的长度必须始终小于或等于原数组长度。数组的每个元素应该是长度为1 的字符(不是 int 整数类型)。在完成原地修改输入数组后,返回数组的新长度。
解题思路
设立一个写指针,初始为第1个字符。一个读指针,初始为第2个字符。读指针读到与写指针相同的数则直接加1,不同的数,则它们的距离就是这个写指针对应字符出现的次数。然后让写指针等于读指针重复此过程到结束。
详情可参考:
https://leetcode-cn.com/problems/string-compression/solution/ya-suo-zi-fu-chuan-gojie-fa-by-xie-xiao-jing/
知识点
基础算法->双指针法
11,移除元素
题目大意
给定一个数组 nums 和一个值 val,你需要原地移除所有数值等于 val 的元素,返回移除后数组的新长度。
解题思路
使用一个指针A遍历,另一个指针指向不重复的新数组位置B(这个新数组是逻辑上的,可以使用原地算法覆盖原数组)。遍历到一个不为val的元素,则B加1.
详情可参考:
https://leetcode-cn.com/problems/remove-element/solution/yi-chu-yuan-su-goliang-chong-jie-fa-by-xie-xiao-ji/
知识点
基础算法->双指针
12,合并两个有序数组
题目大意
给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组。其中nums1长度是num1有效数据长度加上nums2的和。
解题思路
保存两个指针,一个是遍历nums1的指针,一个是遍历nums2的指针。从后向前遍历大小。从后面开始的原因是可以使用原地算法,直接将最后面的数直接放到nums1的后面,同时已经放好的数组不需要再次移动。
详情可参考:
https://leetcode-cn.com/problems/merge-sorted-array/solution/he-bing-liang-ge-you-xu-shu-zu-gojie-fa-by-xie-xia/
知识点
基础算法->双指针
13,最大子序和
题目大意
给定一个整数数组,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
解题思路
保存两个数,一个是当前为止的最大和A,一个是从这个最大和的子数组的开始位置到最大和的连续子数组B。遍历数组,如果B加上当前值的和C大于A,则A等于C。如果C小于0,则B等于0重新开始计数,否则B等于C。实际上是动态规划的思想。
详情可参考:
https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-gojie-fa-by-xie-xiao-jing/
知识点
基础算法->动态规划
14,买股票的最佳时机
题目大意
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
如果你最多只允许完成一笔交易(即买入和卖出一支股票),设计一个算法来计算你所能获取的最大利润。
解题思路
买卖股票的最佳时机抽象一下就是找到一个子序列尾和首的差最大。保存两个数,一个是当前为止的尾和首的差最大A,另外是计算这个最佳值的开始位置。如果当前位置的值减去最佳值开始位置比A还要佳,则替换A。否则如果<0,则当前位置为最低谷。也是动态规划的思想。
详情可参考:
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/mai-mai-gu-piao-de-zui-jia-shi-ji-gojie-fa-by-xie-/
知识点
基础算法->动态规划
总结
我工作十二年了都在刷leetcode,最重要的原因是于想要理解。理解周围的人:年轻人、领导、同事都一样。设身处地做别人做的事情,理解别人的想法、思路,更好的沟通。