目录

1. 移除元素

2. 删除排序链表中的重复元素

3. 搜索旋转排序数组 II

每日一练刷题专栏

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏


1. 移除元素

给你一个数组nums和一个值val,你需要 ​原地​ 移除所有数值等于val的元素,并返回移除后数组的新长度。

不要使用额外的数组空间,你必须仅使用O(1)额外空间并 ​原地修改输入数组

元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。

说明:

为什么返回数值是整数,但输出的答案是数组呢” />https://edu.csdn.net/practice/26880573

代码:

class Solution(object):def removeElement(self, nums, val):ls = len(nums)if ls == 0:return lscount = 0index = 0while index < ls - count:if nums[index] == val:nums[index] = nums[ls - 1 - count]count += 1else:index += 1return ls - countif __name__ == '__main__':s = Solution()print(s.removeElement([3,2,2,3], 3))print(s.removeElement(nums = [0,1,2,2,3,0,4,2], val = 2))

输出:

2
5


2. 删除排序链表中的重复元素

存在一个按升序排列的链表,给你这个链表的头节点head,请你删除所有重复的元素,使每个元素只出现一次

返回同样按升序排列的结果链表。

示例 1:

输入:head = [1,1,2]输出:[1,2]

示例 2:

输入:head = [1,1,2,3,3]输出:[1,2,3]

提示:

  • 链表中节点数目在范围[0, 300]
  • -100 <= Node.val <= 100
  • 题目数据保证链表已经按升序排列

出处:

https://edu.csdn.net/practice/26880574

代码:

class ListNode(object):def __init__(self, x):self.val = xself.next = Noneclass LinkList:def __init__(self):self.head=Nonedef initList(self, data):self.head = ListNode(data[0])r=self.headp = self.headfor i in data[1:]:node = ListNode(i)p.next = nodep = p.nextreturn rdefconvert_list(self,head):ret = []if head == None:returnnode = headwhile node != None:ret.append(node.val)node = node.nextreturn retclass Solution(object):def deleteDuplicates(self, head):if head is None:return Nonepos = headwhile pos is not None and pos.next is not None:if pos.val == pos.next.val:pos.next = pos.next.nextelse:pos = pos.nextreturn head# %%s = Solution()l = LinkList()list1 = [1,1,2]l1 = l.initList(list1)print(l.convert_list(s.deleteDuplicates(l1)))list2 = [1,1,2,3,3]l2 = l.initList(list2)print(l.convert_list(s.deleteDuplicates(l2)))

输出:

[1, 2]
[1, 2, 3]


3. 搜索旋转排序数组 II

已知存在一个按非降序排列的整数数组nums,数组中的值不必互不相同。

在传递给函数之前,nums在预先未知的某个下标k0 <= k < nums.length)上进行了旋转,使数组变为[nums[k], nums[k+1], ..., nums[n-1], nums[0], nums[1], ..., nums[k-1]](下标从 0 开始计数)。例如,[0,1,2,4,4,4,5,6,6,7]在下标5处经旋转后可能变为[4,5,6,6,7,0,1,2,4,4]

给你旋转后的数组nums和一个整数target,请你编写一个函数来判断给定的目标值是否存在于数组中。如果nums中存在这个目标值target,则返回true,否则返回false

示例1:

输入:nums = [2,5,6,0,0,1,2], target = 0输出:true

示例2:

输入:nums = [2,5,6,0,0,1,2], target = 3输出:false

提示:

  • 1 <= nums.length <= 5000
  • -10^4 <= nums[i] <= 10^4
  • 题目数据保证nums在预先未知的某个下标上进行了旋转
  • -10^4 <= target <= 10^4

进阶:

  • 这是 搜索旋转排序数组 的 ​延伸题目,本题中的nums 可能包含重复元素。
  • 这会影响到程序的时间复杂度吗?会有怎样的影响,为什么?

出处:

https://edu.csdn.net/practice/26880575

代码:

class Solution(object):def search(self, nums, target):""":type nums: List[int]:type target: int:rtype: bool"""def get(start, end):if start > end:return Falsemid = (start + end) / 2mid = int(mid)while mid < end and nums[mid + 1] == nums[mid]:mid += 1while start = nums[start]:if target >= nums[start] and target < nums[mid]:return get(start, mid - 1)else:return get(mid + 1, end)elif nums[mid]  nums[mid] and target <= nums[end]:return get(mid + 1, end)else:return get(start, mid - 1)return get(0, len(nums) - 1)# %%s = Solution()print(s.search(nums = [2,5,6,0,0,1,2], target = 0))print(s.search(nums = [2,5,6,0,0,1,2], target = 3))

输出:

True
False


每日一练刷题专栏

持续,努力奋斗做强刷题搬运工!

点赞,你的认可是我坚持的动力!

收藏,你的青睐是我努力的方向!

评论,你的意见是我进步的财富!

主页:https://hannyang.blog.csdn.net/

Golang每日一练 专栏

Python每日一练 专栏

C/C++每日一练 专栏

Java每日一练 专栏