持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情
测试岗位也越来卷了,除了基本的功能测试外,还要有编程基础、脚本经验才脱颖而出。
怎么才能提高我们的编程能力呢,刷LeetCode是最佳的途径之一,话不多数,刷题走起~
一、题目描述:
-
题目内容
-
题目示例
-
题目解析
1 <= n <= 500nums.length == 2n1 <= nums[i] <= 10^3
二、思路分析:
我们拿到本题,读取题目内容要求对2*n个元素[x1,x2,x3,xn,y1,y2,y3,y4]的数组,按照规则重新排序成[x1,y1,x2,y2,x3,y3,xn,yn]元素排序,了解到规则后,数组的特点如下:
- 数组nums长度是2n,函数中会给出n
- 数组中的元素都是数字类型的,范围在[1,10^3]
了解完题目内容后,解答本题我们能快速想到使用双指针方法快速模拟排序的过程,思路如下:
-
方法一:双指针模拟
- nums数组的长度为2n,所以定义两个指针x,y分别指向nums数组的起始0位置和n位置
- 同时定义一个ans临时数组存储重新排序的nums元素
- 使用for循环遍历n个元素,ans分别添加nums[x]和nums[y]的元素
- 并且x和y分别向右+1
class Solution(object): def shuffle(self, nums, n): """ :type nums: List[int] :type n: int :rtype: List[int] """ x = 0 y = n ans = [] for _ in range(n): ans.append(nums[x]) ans.append(nums[y]) x +=1 y +=1 return ans -
方法二:索引规律
- 在该题中,数组的长度是2n,重新排序后数组ans的元素索引和原始数组nums的元素索引进行对比
- ans[2*i]的元素指向是nums[i]的元素
- ans[2*i+1]的元素指向是num[i+n]的元素
- 因此使用for循环遍历nums前n个元素,将ans与nums元素进行赋值
class Solution(object): def shuffle(self, nums, n): """ :type nums: List[int] :type n: int :rtype: List[int] """ ans = [0]*2*n for i in range(n): ans[2*i] = nums[i] ans[2*i+1] = nums[i+n] return ans -
方法三:列表分片法
- Python中,数据类型为list具有分片的功能
- 在nums数组中前n个元素,排序后是按照间隔2步位置,因此nums[::2]= nums[:n]
- nums数组中后n个元素,排序后是排序在奇数位置上的,因此nums[1::2] = num[n:]
class Solution(object): def shuffle(self, nums, n): nums[::2],nums[1::2]=nums[:n],nums[n:] return nums
三、总结:
本题对数组特性进行考察,在2*n的长度数组元素进行重新排序,除了使用双指针模拟外,还可以借助索引位置的规律、分片方法来求解,本题使用索引规律提交,AC记录如下:
- 时间复杂度:O(n),n为传入的参数
- 空间复杂度:O(1),没有使用额外空间
以上是本期内容,欢迎大佬们点赞评论,下期见~~~