携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第19天,点击查看活动详情
前言
终于熬过了周一,周二来了,周五还远吗?今天给大家带来个一个题是重新排列数组
[1470. 重新排列数组] 难度:简单,我做的有些些复杂了,开辟的空间过多。
题目
给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。
示例 1:
输入:nums = [2,5,1,3,4,7], n = 3
输出:[2,3,5,4,1,7]
解释:由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]
示例 2:
输入:nums = [1,2,3,4,4,3,2,1], n = 4
输出:[1,4,2,3,3,2,4,1]
示例 3:
输入:nums = [1,1,2,2], n = 2
输出:[1,2,1,2]
审题
这题基本回点java知识都可以通过,作为简单题他的通过率特别高,我先讲一下我的思路,然后对比着dalao的思路来分析。
我的思路是开辟三块空间,分别为leftArr 与 rightArr以及一个result结果存储空间,然后根据算的的中间值,(对了这个中间值我发现跟n的关系其实是相等的,所以 n = nums.length/2,所以之后我都不管n了,可以看到我的题解中没有n的使用)通过中间值去分割两边数组,然后根据数组循环一次放入新的result数组当中。
dalao的思路是开辟一片空间,并用一次循环搞定,开辟的空间为2* n也就是刚好,正如我们前面所说n = num.length/2的 所以* 2抵消不就原数组长度了嘛。妙啊,然后看下一个循环,这个循环很简单就是为了实现0 2 4 6 8,这是第一个表达式的意思,第二表达式1 3 5 7 9依次循环组合,一样可以得出答案。我个人非常推荐大家使用这个方法。
我的解题代码
public int[] shuffle(int[] nums, int n) {
int halfLength = nums.length / 2;
List<Integer> leftArr = new ArrayList<Integer>();
List<Integer> rightArr = new ArrayList<Integer>();
List<Integer> result = new ArrayList<Integer>();
for (int i = 0; i < nums.length; i++) {
if (i < halfLength){
leftArr.add(nums[i]);
continue;
}
rightArr.add(nums[i]);
}
for (int i = 0; i < leftArr.size(); i++) {
result.add(leftArr.get(i));
result.add(rightArr.get(i));
}
return result.stream().mapToInt(Integer::valueOf).toArray();
}
推荐写法代码
class Solution {
public int[] shuffle(int[] nums, int n) {
int[] ans = new int[2 * n];
for (int i = 0; i < n; i++) {
ans[2 * i] = nums[i];
ans[2 * i + 1] = nums[i + n];
}
return ans;
}
}