LeetCode 3379.转换数组:下标取模
【LetMeFly】3379.转换数组:下标取模
力扣题目链接:https://leetcode.cn/problems/transformed-array/
给你一个整数数组 nums,它表示一个循环数组。请你遵循以下规则创建一个大小 相同 的新数组 result :
对于每个下标 i(其中 0 <= i < nums.length),独立执行以下操作:
- 如果
nums[i] > 0:从下标i开始,向 右 移动nums[i]步,在循环数组中落脚的下标对应的值赋给result[i]。 - 如果
nums[i] < 0:从下标i开始,向 左 移动abs(nums[i])步,在循环数组中落脚的下标对应的值赋给result[i]。 - 如果
nums[i] == 0:将nums[i]的值赋给result[i]。
返回新数组 result。
注意:由于 nums 是循环数组,向右移动超过最后一个元素时将回到开头,向左移动超过第一个元素时将回到末尾。
示例 1:
输入:nums = [3,-2,1,1]
输出:[1,1,1,3]
解释:
- 对于
nums[0]等于 3,向右移动 3 步到nums[3],因此result[0]为 1。 - 对于
nums[1]等于 -2,向左移动 2 步到nums[3],因此result[1]为 1。 - 对于
nums[2]等于 1,向右移动 1 步到nums[3],因此result[2]为 1。 - 对于
nums[3]等于 1,向右移动 1 步到nums[0],因此result[3]为 3。
示例 2:
输入:nums = [-1,4,-1]
输出:[-1,-1,4]
解释:
- 对于
nums[0]等于 -1,向左移动 1 步到nums[2],因此result[0]为 -1。 - 对于
nums[1]等于 4,向右移动 4 步到nums[2],因此result[1]为 -1。 - 对于
nums[2]等于 -1,向左移动 1 步到nums[1],因此result[2]为 4。
提示:
1 <= nums.length <= 100-100 <= nums[i] <= 100
解题方法:下标取模
题目啥意思呢?题目意思是:令 r e s u l t [ i ] = n u m s [ i + n u m s [ i ] ] result[i] = nums[i + nums[i]] result[i]=nums[i+nums[i]]。
但是编程语言中数组 n u m s nums nums可不是循环数组,所以需要将 i + n u m s [ i ] i+nums[i] i+nums[i]映射到 0 ∼ n − 1 0\sim n-1 0∼n−1(对于支持负数下标的编程语言python也可以映射为负数下标)。
t t t如何映射到 0 ∼ n − 1 0\sim n-1 0∼n−1? t % n t\ \%\ n t % n可能为负数,再加上 n n n再对 n n n取模就好了。
- 时间复杂度 O ( l e n ( n u m s ) ) O(len(nums)) O(len(nums))
- 空间复杂度 O ( 1 ) O(1) O(1),算法返回值不计入力扣空间复杂度
AC代码
C++
/* * @LastEditTime: 2026-02-15 18:11:29 */classSolution{public: vector<int>constructTransformedArray(vector<int>& nums){ vector<int>ans(nums.size());for(int i =0, n = nums.size(); i < n; i++){ ans[i]= nums[((i + nums[i])% n + n)% n];}return ans;}};Python
''' LastEditTime: 2026-02-15 18:13:14 '''from typing import List classSolution:defconstructTransformedArray(self, nums: List[int])-> List[int]:return[nums[(nums[i]+ i)%len(nums)]for i inrange(len(nums))]Java
/* * @LastEditTime: 2026-02-15 18:16:30 */classSolution{publicint[]constructTransformedArray(int[] nums){int[] ans =newint[nums.length];for(int i =0, n = nums.length; i < n; i++){ ans[i]= nums[((nums[i]+ i)% n + n)% n];}return ans;}}Go
/* * @LastEditTime: 2026-02-15 18:15:07 */package main funcconstructTransformedArray(nums []int)[]int{ ans :=make([]int,len(nums)) n :=len(nums)for i, v :=range nums { ans[i]= nums[((v + i)% n + n)% n]}return ans }Rust
/* * @LastEditTime: 2026-02-15 18:23:59 */implSolution{pubfnconstruct_transformed_array(nums:Vec<i32>)->Vec<i32>{let n = nums.len()asi32;letmut ans =vec![0; n asusize];for i in0..(n asusize){let j =((nums[i]+ i asi32)% n + n)% n;// 如果一路usize会无法得到负数 ans[i]= nums[j asusize];} ans }}同步发文于ZEEKLOG和我的个人博客,原创不易,转载经作者同意后请附上原文链接哦~
千篇源码题解已开源