哈希表题目汇总

序言

哈希表题目汇总,好好干饭,好好努力,好好加油哦

题目一:检查数组中是否有有两个数相加 等于目标值

给定一个整数数组 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'
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jianafeng

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值