Skip to content

Latest commit

 

History

History
40 lines (32 loc) · 1.53 KB

数组.md

File metadata and controls

40 lines (32 loc) · 1.53 KB

数组

题目 来源 链接 分类 备注
重新排列数组 LeetCode 重新排列数组 数组 位运算

重新排列数组

分析

如果想在空间复杂度O(1)的情况下解决这道问题。那么,数组里的一个位置,就得存储两个数字。已知数字都是小于1000的,所以用10bit就可以存储。 nums[j] <<= 10 先空出10bit,nums[j] |= nums[i] 将nums[i] 存储进去。读数字的时候,nums[j] & 1023 是将后10bit代表的数读出来,nums[j] >> 10之后的数字,就是原本没有左移的数

AC代码

var shuffle = function(nums, n) {
    let i = n - 1;
    for(let j = nums.length - 1; j >= n; j --){
        // 利用位运算  一个位置存两个int
        // 第一个数据左移 10位
        nums[j] <<= 10;
        // 将第二个数字存入
        nums[j] |= nums[i];
        i --;
    }

    i = 0
    for(let j = n; j < nums.length; j ++){
        // 1023 是是个1
        const num1 = nums[j] & 1023;
        const num2 = nums[j] >> 10;
        nums[i] = num1;
        nums[i + 1] = num2;
        i += 2;
    }
    return nums;
};

参考: 📚