给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。
不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。
元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。
输入:nums = [3,2,2,3], val = 3 输出:2, nums = [2,2] 解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。
class Solution(object):
def removeElement(self, nums, val):
"""
:type nums: List[int]
:type val: int
:rtype: int
"""
slowinx=0
fastinx=0
n=len(nums)
while fastinx<=n-1:
if nums[fastinx]!=val:
nums[slowinx]=nums[fastinx]
slowinx+=1
fastinx+=1
return slowinx
n=len(nums)
i=0
while i<=n-1:
if nums[i]==val:
for j in range(i+1,n):
nums[j-1]=nums[j]
i-=1
n-=1
i+=1
return n
给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序。 输入:nums = [-4,-1,0,3,10] 输出:[0,1,9,16,100] 解释:平方后,数组变为 [16,1,0,9,100] 排序后,数组变为 [0,1,9,16,100]
class Solution(object):
def sortedSquares(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
n=len(nums)
tmp=[]
for i in range(n):
tmp.append(nums[i]*nums[i])
tmp.sort()
return tmp
n=len(nums)
tmp=[]
left,right=0,n-1
while left<=right:
if nums[left]<0:
if -nums[left]>nums[right]:
tmp.append(nums[left]*nums[left])
left+=1
else:
tmp.append(nums[right]*nums[right])
right-=1
else:
tmp.append(nums[right]*nums[right])
right-=1
tmp.reverse()
return tmp
给定一个含有 n 个正整数的数组和一个正整数 target 。
找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl+1, …, numsr-1, numsr] ,并返回其长度。如果不存在符合条件的子数组,返回 0 。
输入:target = 7, nums = [2,3,1,2,4,3] 输出:2 解释:子数组 [4,3] 是该条件下的长度最小的子数组。
class Solution(object):
def minSubArrayLen(self, target, nums):
"""
:type target: int
:type nums: List[int]
:rtype: int
"""
n=len(nums)
left=0
res=[]
addnums=0
cnt=0
for right in range(n):
addnums+=nums[right]
cnt+=1
while addnums>=target:
res.append(cnt)
cnt-=1
addnums-=nums[left]
left+=1
if res:
return min(res)
return 0
n=len(nums)
res=[]
for i in range(n):
addnums=0
cnt=0
for j in range(i,n):
cnt+=1
addnums+=nums[j]
if addnums>=target:
res.append(cnt)
break
if res:
return min(res)
return 0
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
输入:s = [“h”,“e”,“l”,“l”,“o”] 输出:[“o”,“l”,“l”,“e”,“h”]
class Solution(object):
def reverseString(self, s):
"""
:type s: List[str]
:rtype: None Do not return anything, modify s in-place instead.
"""
n=len(s)
left,right=0,n-1
tmp=""
while left<right:
tmp=s[left]
s[left]=s[right]
s[right]=tmp
left+=1
right-=1
return s
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。 输入:s = “abcdefg”, k = 2 输出:“bacdfeg”
class Solution(object):
def reverseStr(self, s, k):
"""
:type s: str
:type k: int
:rtype: str
"""
s=list(s)
n=len(s)
left0,right0=0,k-1
while left0<n-1:
left,right=left0,right0
leng=len(s[left0:n])
if leng<k:
right=n-1
tmp=""
while left<right:
tmp=s[left]
s[left]=s[right]
s[right]=tmp
left+=1
right-=1
left0+=2*k
right0+=2*k
return "".join(s)
def reverse_substring(text):
left, right = 0, len(text) - 1
while left < right:
text[left], text[right] = text[right], text[left]
left += 1
right -= 1
return text
res = list(s)
for cur in range(0, len(s), 2 * k):
res[cur: cur + k] = reverse_substring(res[cur: cur + k])
return ''.join(res)
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
class Solution(object):
def reverseList(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
def dfs(pre,curNode):
if not curNode:
return pre
nextNode=curNode.next
curNode.next=pre
return dfs(curNode,nextNode)
return dfs(None,head)
tail=None
if not head:
return None
if not head.next:
return head
curNode=head.next
nextNode=head.next.next
head.next=tail
while curNode and nextNode:
curNode.next=head
head=curNode
curNode=nextNode
nextNode=curNode.next
if head and curNode and not nextNode:
curNode.next=head
return curNode
cur = head
pre = None
while(cur!=None):
temp = cur.next
cur.next = pre
pre = cur
cur = temp
return pre
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
输入:head = [1,2,3,4] 输出:[2,1,4,3]
思路:通过pre\cur\tmp三个指针的移动来改变链表,同时要注意当节点个数是单数时的情况,还有到了链表尾部的None时特别注意。
class Solution(object):
def swapPairs(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
if not head:
return None
if not head.next:
return head
pre=head
cur=pre.next
res=cur
while cur:
tmp=cur.next
cur.next=pre
if not tmp or not tmp.next:
pre.next=tmp
break
pre.next=tmp.next
pre=tmp
cur=tmp.next
return res
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
class Solution(object):
def removeNthFromEnd(self, head, n):
"""
:type head: ListNode
:type n: int
:rtype: ListNode
"""
head_dummy=ListNode()
head_dummy.next=head
slow,fast=head_dummy,head_dummy
n+=1
while n:
fast=fast.next
n-=1
while fast:
fast=fast.next
slow=slow.next
slow.next=slow.next.next
return head_dummy.next
leng=1
head_copy=head
res=head
while head_copy.next:
leng+=1
head_copy=head_copy.next
cnt=leng-n
if cnt==0:
head=head.next
return head
while cnt>1:
head=head.next
cnt-=1
if head.next:
head.next=head.next.next
return res
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
class Solution(object):
def getIntersectionNode(self, headA, headB):
"""
:type head1, head1: ListNode
:rtype: ListNode
"""
headA_copy=headA
headB_copy=headB
while headA or headB:
if headA!=headB:
if headA:
headA=headA.next
else:
headA=headB_copy
if headB:
headB=headB.next
else:
headB=headA_copy
else:
return headA
if not headA and not headB:
return None
给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。 思路:
- 判断链表是否环:分别定义 fast 和 slow 指针,从头结点出发,fast指针每次移动两个节点,slow指针每次移动一个节点,如果 fast 和 slow指针在途中相遇 ,说明这个链表有环。
- 如果有环,如何找到这个环的入口:从头结点出发一个指针,从相遇节点 也出发一个指针,这两个指针每次只走一个节点, 那么当这两个指针相遇的时候就是 环形入口的节点。
class Solution(object):
def detectCycle(self, head):
"""
:type head: ListNode
:rtype: ListNode
"""
slow,fast=head,head
if fast==None:
return None
if fast.next==None:
return None
fast=fast.next.next
slow=slow.next
while slow!=fast and fast and fast.next:
fast=fast.next.next
slow=slow.next
if slow==fast:
while slow!=head:
head=head.next
slow=slow.next
return slow
if fast==None or fast.next==None:
return None
|