一、两数相加
给你两个?非空 的链表,表示两个非负的整数。它们每位数字都是按照?逆序?的方式存储的,并且每个节点只能存储?一位?数字。
请你将两个数相加,并以相同形式返回一个表示和的链表。
你可以假设除了数字 0 之外,这两个数都不会以 0?开头。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2:
输入:l1 = [0], l2 = [0] 输出:[0] 示例 3:
输入:l1 = [9,9,9,9,9,9,9], l2 = [9,9,9,9] 输出:[8,9,9,9,0,0,0,1]
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/add-two-numbers 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
new_head=ListNode(0)
m_head=new_head
cur=0
while l1 or l2:
m=l1.val if l1 else 0
n=l2.val if l2 else 0
sum=m+n+cur
m_head.next=ListNode(sum%10)
cur=sum//10
if l1:l1=l1.next
if l2:l2=l2.next
m_head=m_head.next
if cur:
m_head.next=ListNode(cur)
return new_head.next
二、无重复字符的最长子串
给定一个字符串?s ?,请你找出其中不含有重复字符的?最长子串?的长度。
示例?1:
输入: s = "abcabcbb" 输出: 3? 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2:
输入: s = "bbbbb" 输出: 1 解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。 示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是?"wke",所以其长度为 3。 ?? ? 请注意,你的答案必须是 子串 的长度,"pwke"?是一个子序列,不是子串。 示例 4:
输入: s = "" 输出: 0
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码1
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
if len(s)==0 :
return 0
if len(s)==1 or len(set(s))==1:
return 1
count=0
max_=0
left=0
look=set()
for i in range(len(s)):
count+=1
while s[i] in look:
look.remove(s[left])
left+=1
count-=1
if count>max_:
max_=count
look.add(s[i])
return max_
?代码2
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
dic={}
ans=start=0
for end,v in enumerate(s):
if v in dic:
start=max(dic.get(v)+1,start)
dic[v]=end
ans=max(end-start+1,ans)
return ans
三、删除有序数组中的重复项
给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。
不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。
说明:
为什么返回数值是整数,但输出的答案是数组呢?
请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。
你可以想象内部操作如下:
// nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝 int len = removeDuplicates(nums);
// 在函数里修改输入数组对于调用者是可见的。 // 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。 for (int i = 0; i < len; i++) { ????print(nums[i]); } ? 示例 1:
输入:nums = [1,1,2] 输出:2, nums = [1,2] 解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。 示例 2:
输入:nums = [0,0,1,1,1,2,2,3,3,4] 输出:5, nums = [0,1,2,3,4] 解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def removeDuplicates(self, nums: List[int]) -> int:
low=0
while low<len(nums)-1:
if nums[low]==nums[low+1]:
del nums[low]
else:
low+=1
return len(nums)
四、
给定一个整数数组 nums?,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组?[4,-1,2,1] 的和最大,为?6 。 示例 2:
输入:nums = [1] 输出:1 示例 3:
输入:nums = [0] 输出:0 示例 4:
输入:nums = [-1] 输出:-1 示例 5:
输入:nums = [-100000] 输出:-100000
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/maximum-subarray 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码1
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
temp=nums[0]
max_=temp
for i in range(1,len(nums)):
if temp>0:
temp+=nums[i]
max_=max(max_,temp)
else:
temp=nums[i]
max_=max(max_,temp)
return max_
代码2
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
l=len(nums)
if l==1:
return nums[0]
m=[0 for _ in range(l)]
m[0]=nums[0]
for i in range(1,l):
m[i]=max(m[i-1]+nums[i],nums[i])
return max(m)
五、买卖股票的最佳时机
给定一个数组 prices ,它的第?i 个元素?prices[i] 表示一支给定股票第 i 天的价格。
你只能选择 某一天 买入这只股票,并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最大利润。
返回你可以从这笔交易中获取的最大利润。如果你不能获取任何利润,返回 0 。
示例 1:
输入:[7,1,5,3,6,4] 输出:5 解释:在第 2 天(股票价格 = 1)的时候买入,在第 5 天(股票价格 = 6)的时候卖出,最大利润 = 6-1 = 5 。 ? ? ?注意利润不能是 7-1 = 6, 因为卖出价格需要大于买入价格;同时,你不能在买入前卖出股票。 示例 2:
输入:prices = [7,6,4,3,1] 输出:0 解释:在这种情况下, 没有交易完成, 所以最大利润为 0。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def maxProfit(self, prices: List[int]) -> int:
in_price = prices[0]
out_price = prices[0]
max_profit = 0
for i in prices:
if in_price > i:
max_profit = max(max_profit,out_price-in_price)
in_price = i
out_price = i
if out_price < i:
out_price = i
max_profit = max(max_profit,out_price-in_price)
return max_profit
六、最小栈
设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。
push(x) —— 将元素 x 推入栈中。 pop()?—— 删除栈顶的元素。 top()?—— 获取栈顶元素。 getMin() —— 检索栈中的最小元素。
示例:
输入: ["MinStack","push","push","push","getMin","pop","top","getMin"] [[],[-2],[0],[-3],[],[],[],[]]
输出: [null,null,null,null,-3,null,0,-2]
解释: MinStack minStack = new MinStack(); minStack.push(-2); minStack.push(0); minStack.push(-3); minStack.getMin(); ? --> 返回 -3. minStack.pop(); minStack.top(); ? ? ?--> 返回 0. minStack.getMin(); ? --> 返回 -2.
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/min-stack 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class MinStack:
def __init__(self):
"""
initialize your data structure here.
"""
self.stack = []
self.min_value =[]
def push(self, x: int) -> None:
if not self.min_value:
self.min_value.append(x)
else:
self.min_value.append(min(x,self.min_value[-1]))
self.stack.append(x)
def pop(self) -> None:
self.stack.pop()
self.min_value.pop()
def top(self) -> int:
return self.stack[-1]
def getMin(self) -> int:
return self.min_value[-1]
七、反转链表
给你单链表的头节点?head ?,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
代码1
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
pre=None
cur=head
while cur:
tmp=cur.next
cur.next=pre
pre=cur
cur=tmp
return pre
代码2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, val=0, next=None):
# self.val = val
# self.next = next
class Solution:
def reverseList(self, head: ListNode) -> ListNode:
if head==None or head.next==None:
return head
new_head=self.reverseList(head.next)
head.next.next=head
head.next=None
return new_head
八、. 删除链表中的节点
请编写一个函数,用于 删除单链表中某个特定节点 。在设计函数时需要注意,你无法访问链表的头节点?head ,只能直接访问 要被删除的节点 。
题目数据保证需要删除的节点 不是末尾节点 。
示例 1:
输入:head = [4,5,1,9], node = 5 输出:[4,1,9] 解释:指定链表中值为?5?的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9 示例 2:
输入:head = [4,5,1,9], node = 1 输出:[4,5,9] 解释:指定链表中值为?1?的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9 示例 3:
输入:head = [1,2,3,4], node = 3 输出:[1,2,4] 示例 4:
输入:head = [0,1], node = 0 输出:[1] 示例 5:
输入:head = [-3,5,-99], node = -3 输出:[5,-99] ?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码1
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
while node.next.next is not None:
node.val = node.next.val
node = node.next
node.val = node.next.val
node.next = None
代码2
# Definition for singly-linked list.
# class ListNode:
# def __init__(self, x):
# self.val = x
# self.next = None
class Solution:
def deleteNode(self, node):
"""
:type node: ListNode
:rtype: void Do not return anything, modify node in-place instead.
"""
node.val=node.next.val
node.next=node.next.next
九、有效的字母异位词
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
注意:若?s 和 t?中每个字符出现的次数都相同,则称?s 和 t?互为字母异位词。
示例?1:
输入: s = "anagram", t = "nagaram" 输出: true 示例 2:
输入: s = "rat", t = "car" 输出: false
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/valid-anagram 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码1
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
dict1={}
dict2={}
for ch in s:
#判断dict1是否存在ch的键对值,若不存在则默认值为0
dict1[ch]=dict1.get(ch,0)+1
for ch in t:
dict2[ch]=dict2.get(ch,0)+1
return dict1==dict2
代码2
class Solution:
def isAnagram(self, s: str, t: str) -> bool:
return sorted(list(s))==sorted(list(t))
十、找不同
给定两个字符串 s 和 t,它们只包含小写字母。
字符串?t?由字符串?s?随机重排,然后在随机位置添加一个字母。
请找出在 t 中被添加的字母。
示例 1:
输入:s = "abcd", t = "abcde" 输出:"e" 解释:'e' 是那个被添加的字母。 示例 2:
输入:s = "", t = "y" 输出:"y" 示例 3:
输入:s = "a", t = "aa" 输出:"a" 示例 4:
输入:s = "ae", t = "aea" 输出:"a" ?
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/find-the-difference 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
class Solution:
def findTheDifference(self, s: str, t: str) -> str:
if s=='':
return t
s=list(s)
t=list(t)
for i in s:
for j in t:
if i==j:
t.remove(j)
break
return t[0]
|