序言
哈希表题目汇总,好好干饭,好好努力,好好加油哦
题目一:检查数组中是否有有两个数相加 等于目标值
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]
哈希表是 组成一个字典
将 数组的values作为字典的keys;
将 数组的values对应的index作为字典的values。
后面可以根据数组的values来返回对应的index。
这道题的思路是 先把nums的num放入哈希表中,然后检查target - num 的值 是否在哈希表中,如果在的话就返回相应的index,结束
def twoSum(nums, target):
#创建哈希表
dic = {}
for index,num in enumerate(nums):
if target - num in dic:
return [index, dic[target-num]]
dic[num] = index
return []
题目二:最长的不重复的子字符
请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。
输入: "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串
思路是:哈希表记录所有的 字符 :位置
因为这里求的是最长的不重复字符长度,
其实就是比较重复的两个字符之间的长度 的max
如果完全没有重复字符 就是很简单的 j-i
如果有重复的字符,i,j分别指向两个重复的字符中,长度也是j-i
def lengthOfLongestSubstring(s: str) -> int:
#创建哈希表
dic = {}
#初始化i
i = -1
ans = 0
for j in range(len(s)):
if s[j] in dic:
i = max(dic[s[j]],i)
dic[s[j]]=j
ans = max(ans, j-i)
return ans
题目三:LT316. 去除重复字母
给你一个字符串 s ,请你去除字符串中重复的字母,使得每个字母只出现一次。
需保证 返回结果的字典序最小(要求不能打乱其他字符的相对位置)。
输入:s = "bcabc"
输出:"abc"
输入:s = "cbacdcbc"
输出:"acdb"
思路是:先做一个统计,看重复的数字有多少
如果遇到重复的,直接 -=1
如果不是重复的,放在 stack里 如果这个字符比stack[-1]的小,那就看看能不能把stack[-1] pop掉 入锅stack[-1] 后面还有重复 那就可以把stack[-1] pop掉 录入后面重复的即可。
def removeDuplicateLetters( s: str) -> str:
stack = []
count = Collections.Counter(s)
for i in s:
if i not in stack:
while stack and stack[-1] > i and count[stack[-1]]>0:
stack.pop()
stack.append(i)
count[i] -= 1
return ''.join(stack)
时间复杂度:由于判断当前字符是否在栈上存在需要 O(N)O(N) 的时间,因此总的时间复杂度就是 O(N ^ 2),其中 N 为字符串长度。
空间复杂度:我们使用了额外的栈来存储数字,因此空间复杂度为 O(N),其中 N为字符串长度
题目四:移调K位数字
给定一个以字符串表示的非负整数 num,移除这个数中的 k 位数字,使得剩下的数字最小。
输入: num = "1432219", k = 3
输出: "1219"
解释: 移除掉三个数字 4, 3, 和 2 形成一个新的最小的数字 1219。
输入: num = "10200", k = 1
输出: "200"
解释: 移掉首位的 1 剩下的数字为 200. 注意输出不能有任何前导零。
输入: num = "10", k = 2
输出: "0"
解释: 从原数字移除所有的数字,剩余为空就是 0。
class Solution:
def removeKdigits(self, num: str, k: int) -> str:
#special case
if len(num) == k: return '0'
keep = len(num) - k
stack = []
for n in num:
while stack and k and stack[-1] > n:
stack.pop()
k -= 1
stack.append(n)
#remove '0'l
ans = ''.join(stack[:keep])
ans = ans.lstrip('0')
return ans if ans else '0'