基于排列构建数组

68 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第7天,点击查看活动详情

题目描述

给你一个 从 0 开始的排列 nums(下标也从 0 开始)。请你构建一个 同样长度 的数组 ans ,其中,对于每个 i(0 <= i < nums.length),都满足 ans[i] = nums[nums[i]] 。返回构建好的数组 ans 。
从 0 开始的排列 nums 是一个由 0 到 nums.length - 1(0 和 nums.length - 1 也包含在内)的不同整数组成的数组。
来源:力扣(LeetCode)

  • 示例 1
输入:nums = [0,2,1,5,3,4]
输出:[0,1,2,4,5,3]
解释:数组 ans 构建如下:
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
    = [nums[0], nums[2], nums[1], nums[5], nums[3], nums[4]]
    = [0,1,2,4,5,3]
  • 示例 2
输入:nums = [5,0,1,2,3,4]
输出:[4,5,0,1,2,3]
解释:数组 ans 构建如下:
ans = [nums[nums[0]], nums[nums[1]], nums[nums[2]], nums[nums[3]], nums[nums[4]], nums[nums[5]]]
    = [nums[5], nums[0], nums[1], nums[2], nums[3], nums[4]]
    = [4,5,0,1,2,3]

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] < nums.length
  • nums 中的元素 互不相同

思路分析

根据题意可知,题目给出一个从 0 开始的排列 nums(下标也从 0 开始),我们把这个数组里面的每一项作为下标从nums取出对应的数字,组成新的数组newNums。从题目的提示知道,数组nums里面的每个元素都大于等于0,不会出现负数的可能,并且,元素的最大值也不会大于数组长度,防止会取不到值。不会给一个空数组。
声明一个新的空数组,用来存放新的元素。开始循环遍历数组nums,取出数组的每一个元素,把每一个元素作为一个下标,根据这个下标取出数组nums对应的元素push到newNums里面,数组newNums就是我们想要的结果

AC代码

function solution(nums) {
    let newNums = [];
    for(let i=0; i<nums.length; i++) {
        const key = nums[i]
        newNums.push(nums[key])
    }
    console.log(newNums)
}
let  nums = [0,2,1,5,3,4];
solution(nums)