LeetCode 1389:按指定顺序创建目标数组的代码问题求助
解决LeetCode《按指定顺序创建目标数组》的代码问题
问题核心
题目要求按顺序将nums[i]插入到target数组的index[i]位置,核心是插入操作——插入时需要将目标位置及之后的元素向后移动,再放入新元素,而不是直接覆盖目标位置的值。你的代码逻辑完全偏离了这个要求,导致结果错误。
错误代码的问题点
- 嵌套的
j循环完全冗余:每次外层循环执行时,内层循环会把target[index[i]]重复赋值nums.length次,最终每个位置只会保留最后一次被赋值的元素,完全没有模拟插入过程。 - 直接赋值数组元素:普通数组长度固定,插入元素必须先将目标位置及后续元素后移一位,你的代码跳过了这个关键步骤,直接覆盖值,根本不是插入逻辑。
正确解法
方法一:利用ArrayList的插入特性(简单直观)
ArrayList的add(int index, E element)方法可以直接在指定位置插入元素,自动处理后续元素的后移,非常适配该场景:
import java.util.ArrayList; import java.util.Arrays; public class LeetCode1389 { public static void main(String[] args) { System.out.println(Arrays.toString(createTargetArray(new int[]{0,1,2,3,4}, new int[]{0,1,2,2,1}))); } static int[] createTargetArray(int[] nums, int[] index) { ArrayList<Integer> list = new ArrayList<>(); for (int i = 0; i < nums.length; i++) { list.add(index[i], nums[i]); } // 将ArrayList转为int数组 int[] target = new int[nums.length]; for (int i = 0; i < list.size(); i++) { target[i] = list.get(i); } return target; } }
方法二:手动用数组实现插入逻辑(理解底层原理)
如果不想用集合,可以手动处理数组元素的后移操作:
import java.util.Arrays; public class LeetCode1389 { public static void main(String[] args) { System.out.println(Arrays.toString(createTargetArray(new int[]{0,1,2,3,4}, new int[]{0,1,2,2,1}))); } static int[] createTargetArray(int[] nums, int[] index) { int[] target = new int[nums.length]; // 记录当前target数组中已插入的元素个数 int size = 0; for (int i = 0; i < nums.length; i++) { int idx = index[i]; // 将idx到size-1位置的元素向后移动一位 for (int j = size; j > idx; j--) { target[j] = target[j-1]; } // 插入当前元素 target[idx] = nums[i]; size++; } return target; } }
测试结果
对于输入nums = [0,1,2,3,4],index = [0,1,2,2,1],正确输出为[0,4,1,3,2],上述两种解法均可得到该结果。
内容的提问来源于stack exchange,提问作者Sourav Borah
相关产品推荐
相关产品推荐

