题目 | 来源 | 链接 | 分类 | 备注 |
---|---|---|---|---|
重新排列数组 | LeetCode | 重新排列数组 | 数组 位运算 |
如果想在空间复杂度O(1)的情况下解决这道问题。那么,数组里的一个位置,就得存储两个数字。已知数字都是小于1000的,所以用10bit就可以存储。 nums[j] <<= 10 先空出10bit,nums[j] |= nums[i] 将nums[i] 存储进去。读数字的时候,nums[j] & 1023 是将后10bit代表的数读出来,nums[j] >> 10之后的数字,就是原本没有左移的数
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;
};
参考: 📚