【算法学习】1470. 重新排列数组(java / c / c++ / python / go / rust)

简介: 给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

1470. 重新排列数组:

给你一个数组 nums ,数组中有 2n 个元素,按 [x1,x2,...,xn,y1,y2,...,yn] 的格式排列。

请你将数组按 [x1,y1,x2,y2,...,xn,yn] 格式重新排列,返回重排后的数组。

样例 1

输入:
  nums = [2,5,1,3,4,7], n = 3
  
输出:
  [2,3,5,4,1,7] 
  
解释:
  由于 x1=2, x2=5, x3=1, y1=3, y2=4, y3=7 ,所以答案为 [2,3,5,4,1,7]

样例 2

输入:
  nums = [1,2,3,4,4,3,2,1], n = 4
  
输出:
  [1,4,2,3,3,2,4,1]

样例 3

输入:
  nums = [1,1,2,2], n = 2
  
输出:
  [1,2,1,2]

提示

  • 1 <= n <= 500
  • nums.length == 2n
  • 1 <= nums[i] <= 10^3

分析

  • 这道算法题是简单题,所以又可以重拳出击了。
  • 返回的结果不算在空间复杂度上,所以直接开辟新的空间赋值返回结果就可以了。
  • 但是二当家的发现可以难为自己,于是又灵机一动,原地排列,我真是个小机灵鬼。
  • 想要原地排列就一定要存储中间结果,原来的位置被占以后,需要知道原来位置的数字。
  • 提示里说每个数字最大不超过1000,而且都是正数,所以只需要用10个二进制位就够了。
  • 参数传递进来的数组一般都是int型数组,int型一般都是32位,够存题目中的2个数了。

题解

java

class Solution {
    public int[] shuffle(int[] nums, int n) {
        // 申请新的数组,这样用空间换时间
        int[] ans = new int[n * 2];
        for (int i = 0; i < n; ++i) {
            ans[2 * i] = nums[i];
            ans[2 * i + 1] = nums[n + i];
        }
        return ans;
    }
}
class Solution {
    public int[] shuffle(int[] nums, int n) {
        // 原地排列,时间换空间
        for (int i = 0; i < n; ++i) {
            // 把重排列的值左移10位
            nums[2 * i] |= (nums[i] & 0b1111111111) << 10;
            nums[2 * i + 1] |= (nums[n + i] & 0b1111111111) << 10;
        }
        // 将结果右移10位,低10位的原值没用了
        for (int i = 0; i < n; ++i) {
            nums[2 * i] >>= 10;
            nums[2 * i + 1] >>= 10;
        }
        return nums;
    }
}

c

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
    // 申请新的数组,这样用空间换时间
    int *ans = (int *) malloc(sizeof(int) * numsSize);
    for (int i = 0; i < n; ++i) {
        ans[2 * i] = nums[i];
        ans[2 * i + 1] = nums[n + i];
    }
    *returnSize = numsSize;
    return ans;
}
/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* shuffle(int* nums, int numsSize, int n, int* returnSize){
    // 原地排列,时间换空间
    for (int i = 0; i < n; ++i) {
        // 把重排列的值左移10位
        nums[2 * i] |= (nums[i] & 0b1111111111) << 10;
        nums[2 * i + 1] |= (nums[n + i] & 0b1111111111) << 10;
    }
    // 将结果右移10位,低10位的原值没用了
    for (int i = 0; i < n; ++i) {
        nums[2 * i] >>= 10;
        nums[2 * i + 1] >>= 10;
    }
    *returnSize = numsSize;
    return nums;
}

c++

class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        // 申请新的数组,这样用空间换时间
        vector<int> ans;
        for (int i = 0; i < n; ++i) {
            ans.push_back(nums[i]);
            ans.push_back(nums[n + i]);
        }
        return ans;
    }
};
class Solution {
public:
    vector<int> shuffle(vector<int>& nums, int n) {
        // 原地排列,时间换空间
        for (int i = 0; i < n; ++i) {
            // 把重排列的值左移10位
            nums[2 * i] |= (nums[i] & 0b1111111111) << 10;
            nums[2 * i + 1] |= (nums[n + i] & 0b1111111111) << 10;
        }
        // 将结果右移10位,低10位的原值没用了
        for (int i = 0; i < n; ++i) {
            nums[2 * i] >>= 10;
            nums[2 * i + 1] >>= 10;
        }
        return nums;
    }
};

python

class Solution:
    def shuffle(self, nums: List[int], n: int) -> List[int]:
        # 申请新的数组,这样用空间换时间
        ans = []
        for i in range(n):
            ans.append(nums[i]) 
            ans.append(nums[n + i])
        return ans
class Solution:
    def shuffle(self, nums: List[int], n: int) -> List[int]:
        # 原地排列,时间换空间
        for i in range(n):
            # 把重排列的值左移10位
            nums[2 * i] |= (nums[i] & 0b1111111111) << 10;
            nums[2 * i + 1] |= (nums[n + i] & 0b1111111111) << 10
        # 将结果右移10位,低10位的原值没用了
        for i in range(n):
            nums[2 * i] >>= 10
            nums[2 * i + 1] >>= 10
        return nums

go

func shuffle(nums []int, n int) []int {
    // 申请新的数组,这样用空间换时间
    ans := make([]int, 0, n*2)
    for i := 0; i < n; i++ {
      ans = append(ans, nums[i], nums[n+i])
    }
    return ans
}
func shuffle(nums []int, n int) []int {
    // 原地排列,时间换空间
    for i := 0; i < n; i++ {
      // 把重排列的值左移10位
      nums[2*i] |= (nums[i] & 0b1111111111) << 10
      nums[2*i+1] |= (nums[n+i] & 0b1111111111) << 10
    }
    // 将结果右移10位,低10位的原值没用了
    for i := 0; i < n; i++ {
      nums[2*i] >>= 10
      nums[2*i+1] >>= 10
    }
    return nums
}

rust

impl Solution {
    pub fn shuffle(nums: Vec<i32>, n: i32) -> Vec<i32> {
        let n: usize = n as usize;
        // 申请新的数组,这样用空间换时间
        let mut ans = Vec::new();
        (0..n).for_each(|i| {
            ans.push(nums[i]);
            ans.push(nums[n + i]);
        });
        ans
    }
}
impl Solution {
    pub fn shuffle(nums: Vec<i32>, n: i32) -> Vec<i32> {
        let mut nums = nums;
        let n = n as usize;
        // 原地排列,时间换空间
        (0..n).for_each(|i| {
            // 把重排列的值左移10位
            nums[2 * i] |= (nums[i] & 0b1111111111) << 10;
            nums[2 * i + 1] |= (nums[n + i] & 0b1111111111) << 10;
        });
        // 将结果右移10位,低10位的原值没用了
        (0..n).for_each(|i| {
            nums[2 * i] >>= 10;
            nums[2 * i + 1] >>= 10;
        });
        nums
    }
}

在这里插入图片描述


非常感谢你阅读本文~
放弃不难,但坚持一定很酷~
希望我们大家都能每天进步一点点~
本文由 二当家的白帽子:https://developer.aliyun.com/profile/sqd6avc7qgj7y 博客原创~

相关文章
|
1月前
|
算法 前端开发 数据处理
小白学python-深入解析一位字符判定算法
小白学python-深入解析一位字符判定算法
48 0
|
1月前
|
机器学习/深度学习 算法 搜索推荐
从理论到实践,Python算法复杂度分析一站式教程,助你轻松驾驭大数据挑战!
【10月更文挑战第4天】在大数据时代,算法效率至关重要。本文从理论入手,介绍时间复杂度和空间复杂度两个核心概念,并通过冒泡排序和快速排序的Python实现详细分析其复杂度。冒泡排序的时间复杂度为O(n^2),空间复杂度为O(1);快速排序平均时间复杂度为O(n log n),空间复杂度为O(log n)。文章还介绍了算法选择、分而治之及空间换时间等优化策略,帮助你在大数据挑战中游刃有余。
60 4
|
1月前
|
机器学习/深度学习 缓存 算法
Python算法设计中的时间复杂度与空间复杂度,你真的理解对了吗?
【10月更文挑战第4天】在Python编程中,算法的设计与优化至关重要,尤其在数据处理、科学计算及机器学习领域。本文探讨了评估算法性能的核心指标——时间复杂度和空间复杂度。通过详细解释两者的概念,并提供快速排序和字符串反转的示例代码,帮助读者深入理解这些概念。同时,文章还讨论了如何在实际应用中平衡时间和空间复杂度,以实现最优性能。
65 6
|
9天前
|
算法 关系型数据库 MySQL
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
在分布式系统中,确保每个节点生成的 ID 唯一且高效至关重要。Snowflake 算法由 Twitter 开发,通过 64 位 long 型数字生成全局唯一 ID,包括 1 位标识位、41 位时间戳、10 位机器 ID 和 12 位序列号。该算法具备全局唯一性、递增性、高可用性和高性能,适用于高并发场景,如电商促销时的大量订单生成。本文介绍了使用 Go 语言的 `bwmarrin/snowflake` 和 `sony/sonyflake` 库实现 Snowflake 算法的方法。
21 1
分布式唯一ID生成:深入理解Snowflake算法在Go中的实现
|
8天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
36 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
8天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
29 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
8天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
47 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
13天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
30 2
|
1月前
|
存储 机器学习/深度学习 算法
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
蓝桥杯Python编程练习题的集合,涵盖了从基础到提高的多个算法题目及其解答。
60 3
蓝桥杯练习题(三):Python组之算法训练提高综合五十题
|
22天前
|
算法 测试技术 开发者
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗
在Python开发中,性能优化和代码审查至关重要。性能优化通过改进代码结构和算法提高程序运行速度,减少资源消耗;代码审查通过检查源代码发现潜在问题,提高代码质量和团队协作效率。本文介绍了一些实用的技巧和工具,帮助开发者提升开发效率。
25 3
下一篇
无影云桌面