88. 合并两个有序数组
方法一 : 合并后排序
最朴素的解法就是将两个数组合并之后再排序。
方法二 : 双指针 / 从前往后
最直接的算法实现是将指针p1
置为nums1
的开头,p2
为nums2
的开头,在每一步将最小值放入输出数组中。
方法三 : 双指针 / 从后往前
如果我们从结尾开始改写nums1
的值又会如何呢?这里没有信息,因此不需要额外空间。
125. 验证回文串
方法一:筛选 + 判断
最简单的方法是对字符串 ss 进行一次遍历,并将其中的字母和数字字符进行保留,放在另一个字符串 sgood 中。这样我们只需要判断sgood 是否是一个普通的回文串即可。
判断的方法有两种。第一种是使用语言中的字符串翻转 API 得到sgood 的逆序字符串 sgood_rev,只要这两个字符串相同,那么sgood 就是回文串。
第二种是使用双指针。初始时,左右指针分别指向sgood 的两侧,随后我们不断地将这两个指针相向移动,每次移动一步,并判断这两个指针指向的字符是否相同。当这两个指针相遇时,就说明 sgood 时回文串。
方法二:在原字符串上直接判断
我们直接在原字符串 ss 上使用双指针。在移动任意一个指针时,需要不断地向另一指针的方向移动,直到遇到一个字母或数字字符,或者两指针重合为止。也就是说,我们每次将指针移到下一个字母字符或数字字符,再判断这两个指针指向的字符是否相同。
136. 只出现一次的数字
方法一:集合 | 哈希表
使用集合存储数字。遍历数组中的每个数字,如果集合中没有该数字,则将该数字加入集合,如果集合中已经有该数字,则将该数字从集合中删除,最后剩下的数字就是只出现一次的数字。
使用哈希表存储每个数字和该数字出现的次数。遍历数组即可得到每个数字出现的次数,并更新哈希表,最后遍历哈希表,得到只出现一次的数字。
使用集合存储数组中出现的所有数字,并计算数组中的元素之和。由于集合保证元素无重复,因此计算集合中的所有元素之和的两倍,即为每个元素出现两次的情况下的元素之和。由于数组中只有一个元素出现一次,其余元素都出现两次,因此用集合中的元素之和的两倍减去数组中的元素之和,剩下的数就是数组中只出现一次的数字。
方法二:位运算
数组中的全部元素的异或运算结果即为数组中只出现一次的数字。
141. 环形链表
方法一:哈希表
我们可以通过检查一个结点此前是否被访问过来判断链表是否为环形链表。常用的方法是使用哈希表。
方法二:双指针
想象一下,两名运动员以不同的速度在环形赛道上跑步会发生什么?
通过使用具有不同速度的快、慢两个指针遍历链表。
155. 最小栈
方法一:辅助栈
在每个元素a
入栈时把当前栈的最小值m
存储起来。在这之后无论何时,如果栈顶元素是a
,我们就可以直接返回存储的最小值m
。
160. 相交链表
方法一: 暴力法
对链表A中的每一个结点 a_iai,遍历整个链表 B
并检查链表 B
中是否存在结点和 a_iai 相同。
方法二: 哈希表法
遍历链表 A 并将每个结点的地址/引用存储在哈希表中。然后检查链表 B 中的每一个结点 bi 是否在哈希表中。若在,则 bi 为相交结点。
171. Excel表列序号
方法一:进制转换
因为有26个字母,所以相当于26进制,每26个数则向前进一位。
172. 阶乘后的零
方法一:计算阶乘
计算它的末尾数 0 个数,通过反复检查数字是否可以被1010整除来计算末尾 0 的个数。
方法二:计算因子 5
计算每个数字中的因子5。我们可以使用一个循环而不是 if 语句,我们若有因子5将数字除以5。如果还有剩余的因子5,则将重复步骤。
方法三:高效的计算因子 5</