【算法学习】1920,终于有人把Golang程序员必学知识点全整理出来了

24 阅读1分钟
输入:
	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,999]之间,这是个关键。


题解

java

按照题意的直接处理法

class Solution {
    public int[] buildArray(int[] nums) {
        final int n = nums.length;
        
        int[] ans = new int[n];
        
        for (int i = 0; i < n; ++i) {
            ans[i] = nums[nums[i]];
        }
        
        return ans;
    }
}

不开辟新的空间,直接在原数组处理

class Solution {
    public int[] buildArray(int[] nums) {
        final int n         = nums.length;
        final int highValue = 1000;

        // 将结果值附加到数组
        for (int i = 0; i < n; ++i) {
            // 将原值+结果
            // 一个值同时存储了原值和结果值
            nums[i] += highValue \* (nums[nums[i]] % highValue);
        }

        // 将原值剔除,仅保留结果
        for (int i = 0; i < n; ++i) {
            nums[i] /= highValue;
        }

        return nums;
    }
}


c

/\*\*
 \* Note: The returned array must be malloced, assume caller calls free().
 \*/
int\* buildArray(int\* nums, int numsSize, int\* returnSize){
    const int highValue = 1000;

    for (int i = 0; i < numsSize; ++i) {
        nums[i] += highValue \* (nums[nums[i]] % highValue);
    }

    for (int i = 0; i < numsSize; ++i) {
        nums[i] /= highValue;
    }

    \*returnSize = numsSize;

    return nums;
}


c++

class Solution {
public:
    vector<int> buildArray(vector<int>& nums) {
        const int highValue = 1000;
        int n = nums.size();

        for (int i = 0; i < n; ++i) {
            nums[i] += highValue \* (nums[nums[i]] % highValue);
        }
        
        for (int i = 0; i < n; ++i) {
            nums[i] /= highValue;
        }

        return nums;
    }
};


python

from typing import List

class Solution:
    def buildArray(self, nums: List[int]) -> List[int]:
        highValue = 1000
        n = len(nums)
        for i in range(n):
            nums[i] += highValue \* (nums[nums[i]] % highValue)
        for i in range(n):
            nums[i] //= highValue
        return nums


go

func buildArray(nums []int) []int {
	highValue := 1000
	n := len(nums)

	for i := 0; i < n; i++ {
		nums[i] += highValue \* (nums[nums[i]] % highValue)
	}

	for i := 0; i < n; i++ {
		nums[i] /= highValue
	}

	return nums;
}


rust

impl Solution {
    pub fn build\_array(nums: Vec<i32>) -> Vec<i32> {
        let mut nums = nums;
        
        let high_value = 1000;
        let n = nums.len();
        
        for i in 0..n {
            nums[i] += high_value \* (nums[nums[i] as usize] % high_value);
        }

        for i in 0..n {


![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/b2cbb4794b9e432996a25607196ba195~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252359&x-signature=JGS8P%2Fn9e9ZTX%2BfkrzgO8m3KrdQ%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a4c89c2840f541928012816681bd2c25~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252359&x-signature=fEiyRwOAeYa6gvbEDrTvujygaE8%3D)
![img](https://p6-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/a1e1d942461c4aa8936d5083a6de2f6a~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg5py65Zmo5a2m5Lmg5LmL5b-DQUk=:q75.awebp?rk3s=f64ab15b&x-expires=1771252359&x-signature=aiTDkpSDPr8Dvv4d8NevUNbJ3Fw%3D)

**既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!**

**由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新**

**[如果你需要这些资料,可以戳这里获取](https://gitee.com/vip204888)**