每日一道题,提升一点点
1389. 按既定顺序创建目标数组
给你两个整数数组 nums 和 index。你需要按照以下规则创建目标数组:
目标数组 target 最初为空。
按从左到右的顺序依次读取 nums[i] 和 index[i],在 target 数组中的下标 index[i] 处插入值 nums[i] 。
重复上一步,直到在 nums 和 index 中都没有要读取的元素。
请你返回目标数组。
题目保证数字插入位置总是存在。
示例 1:
输入:nums = [0,1,2,3,4], index = [0,1,2,2,1]
输出:[0,4,1,3,2]
解释:
nums index target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
3 2 [0,1,3,2]
4 1 [0,4,1,3,2]
示例 2:
输入:nums = [1,2,3,4,0], index = [0,1,2,3,0]
输出:[0,1,2,3,4]
解释:
nums index target
1 0 [1]
2 1 [1,2]
3 2 [1,2,3]
4 3 [1,2,3,4]
0 0 [0,1,2,3,4]
示例 3:
输入:nums = [1], index = [0]
输出:[1]
提示:
1.题目分析
index nums target
0 0 [0]
1 1 [0,1]
2 2 [0,1,2]
2 3 [0,1,3,2]
1 4 [0,4,1,3,2]
我们拿上面的示例1来分析:
我们再分析下target数组在内存中的处理过程,首先我们根据index和nums数组长度,得知target长度为5,则int[] target = new int[5];已知数组新建的默认值是0
第一步:target[0] = 0
第二步:target[1] = 1
第三步:target[2] = 2
第四步:target[2] = 3
第五步:target[1] = 4
我们可以发现 target 在 index[i] 处插入 nums[i] 时,相当于将 index[i] 及之后的值往后挪了一位,所以我们可以先写出这个功能来
public void moveBack(int[] a, int index) {
// 数组 a 的 index 索引之后的值全部往后挪一位
for (int i = a.length - 1; i > index; i--) {
a[i] = a[i - 1];
}
}
然后我们再在总的方法里调用这个 moveBack 函数将索引 index[i] 和之后的值往后移一位,之后将 nums[i] 赋值给 target[index[i]]
class Solution {
public int[] createTargetArray(int[] nums, int[] index) {
// 根据 index 数组初始化 target 数组
int[] target = new int[index.length];
// 先将索引 index[i] 和之后的值往后移一位
// 再给 target[index[i]] 赋值 nums[i]
for (int i = 0; i < index.length; i++) {
moveBack(target , index[i]);
target[index[i]] = nums[i];
}
return target;
}
public void moveBack(int[] a, int index) {
// 数组 a 的 index 索引之后的值全部往后挪一位
for (int i = a.length - 1; i > index; i--) {
a[i] = a[i - 1];
}
}
}