【算法学习】1920

题目描述既是答案,直接新建一个同样大小的数组,遍历一遍,按顺序赋值即可。

但是这样需要占更多内容空间,而且单纯这样做,根本算不上算法吧?

怎样能做到不占用新的内存空间呢?提示中,每个数的范围都在[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);
        }



# 最后

现在其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

![](https://img-blog.csdnimg.cn/img_convert/9537b2f5b5c1a591fbe68b03526ed14e.webp?x-oss-process=image/format,png)

其实从大厂招聘需求可见,在招聘要求上有高并发经验优先,包括很多朋友之前都是做传统行业或者外包项目,一直在小公司,技术搞的比较简单,没有怎么搞过分布式系统,但是现在互联网公司一般都是做分布式系统。

所以说,如果你想进大厂,想脱离传统行业,这些技术知识都是你必备的,下面自己手打了一份Java并发体系思维导图,希望对你有所帮助。

[外链图片转存中...(img-fmj5HouP-1714533636095)]

> **本文已被[CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】](https://bbs.csdn.net/topics/618154847)收录**
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值