【力扣】面试经典150题总结01-数组/字符串
1.合并两个有序数组(简单)
要求直接在num1上操作,已经预留了空间,所以直接倒着从大到小插入。当其中一个数组遍历完,就把另一个数组剩余的部分插入。
2.移除元素(简单)
要求原地移除数组中所有val元素,使用双指针,一个指针p1为已经确定的元素,另一个指针p2判断是否为val,不是则将当前值赋值给p1,依次进行。
3.删除有序数组的重复项(简单)
原地删除数组中重复元素,数组为非严格递增排列,跟上一题相似,所以双指针遍历数组。right指针移动到当前元素最后一个重复的元素,left指针为确定元素的范围。
4.删除有序数组的重复项2(中等)
更改了上题的条件为相同元素只出现两次,双指针。也是找到最后一个相似的,然后计算相似的个数,>=2个就留两个,否则留1个。
5.多数元素(简单)
返回数量大于n/2的元素。用map记录,key为元素,value为个数,计数过程记录最大的value的key,最后返回。
6.轮转数组(中等)
将数组轮转k个位置。数学算法。先将数组反转,然后再反转k~n-1和0到k-1就能得到轮转后的数组。
7.买卖股票的最佳时机(简单)
只能买卖一次,贪心。边遍历边记录股票最便宜的价格,如果当前值比最小值大,计算当前值-最小值后,是否比最大盈利大。
8.买卖股票的最佳时机2(中等)
每天都可以买卖,贪心。遍历一遍,(prices[i]-prices[i-1]>0)盈利的就可以直接加进去。
9.跳跃游戏(中等)
找跳跃最大长度,贪心。遍历时维护一个可以跳跃的最远距离,如果距离大于n-1就能跳到终点,到达不了i则直接跳出循环返回false。
10.跳跃游戏2(中等)
要最小跳跃数,贪心。用一个end表示每次能最远跳到的位置,i遍历到end的过程中记录新的最远能到达的长度,到达end则jump+1,end更新为新的最远长度。
11.H指数(中等)
题意难懂,其实是找最大的“n篇论文被引用>=n次”,贪心。创建一个数组记录被引用超过n次论文的个数,n最多不超过论文总数,所以从数组长度就为n+1(因为题目要求下标从1开始)。然后倒序累加,当sum值>=i则说明符合条件了,可以返回。
12.O(1)时间插入、删除和获取随机元素(中等)
变长数组+哈希表。
插入:直接插入到list的最后,用map记录,key为值、value为位置。
移除:把最后的值和要删除的值交换,然后删除最后的值。
随机:random.nextInt(list.size())
13.除自身以外数组的乘积(中等)
技巧。遍历两轮,一轮装从左到右累乘的结果,另一轮从右到左,用两个数组装结果。最后再用一个数组装最后结过,用元素左侧元素的累乘*元素右侧元素的累乘。
14.加油站(中等)
贪心+遍历。当从i出发,到达k位置没法再继续,则说明在有油的情况下从k点出发依旧无法继续,则直接从k+1的位置继续遍历。
15.最后一个单词的长度(简单)
字符串操作,用split("\\s+")移除所有空格并分割成字符串数组,然后取最后一个元素.length()就可以了。
16.最长公共前缀(简单)
字符串操作。toCharArray转为字符数组,遍历并判断前缀是否相同,每次遍历更新前缀的最短相同长度并在条件进行判断,提升性能。
17.反转字符串中的单词(中等)
字符串操作。先用.trim()去掉开头和末尾的空白字符,然后用split("\\s+")分割字符串数组装进List中,用Collections.reverse翻转,最后用String.join(" ", wordList);来转成字符串并返回。
18.Z字形变换(中等)
技巧。创建一个长度为n的ArrayList<StringBuilder>数组list,遍历字符串,从0~n-1来回添加到list中,最后再进行拼接就行了。
19.找出字符串中第一个匹配项的下标(简单)
KMP算法。先计算匹配串的next数组,然后再进行匹配。
next数组计算方法:i = 2, j = 0每次判断short[i]和short[j-1]的元素是否相等,相等则next[i] = j,不相等则j=next[j]
匹配:i = 1, j = 0,每次判断short[j+1]和long[i]是否相等,相等则j++,否则j = next[j]。当j == m(子串长度)说明匹配成了,返回结果。