【位运算】【左右位移】Leetcode 2917. 找出数组中的 K-or 值
---------------🎈🎈题目链接 2917. 找出数组中的 K-or 值🎈🎈-------------------
【1】<<
:左位移运算符
符号位不变,低位补0。移几位补几个0。正数或者负数左移,低位都是用0补。
【2】>>
:右位移运算符
如果值为正,则在高位补0,如果值为负,则在高位补1
【3】位运算符结合赋值操作
&=
按位与赋值
|=
按位或赋值
^=
按位异或赋值
>>=
右移赋值
>>>=
无符号右移赋值
<<=
赋值左移
【4】转化大小写:
【5】交换两个数
public void test2() {
int n = 2;
int m = 3;
n = n ^ m;
m = m ^ n; //m = m ^ (n ^ m) => m=n
n = n ^ m; //n = (n ^ m)^[m ^ (n ^ m)] => n=m
System.out.println(n + ";" + m); //3;2
}
异或计算规则:
① a ^ a =0 (任何数异或本身结果为0)
② a ^ b =b ^ a (交换律)
③ a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c (结合律)
④ 0 ^ a = a (异或0具有保持的特点)
⑤ a ^ b ^ a = b (根据①②④可得)
原文链接:https://blog.csdn.net/qq_42265220/article/details/118386893
解法 位运算
7: 0 1 1 1 12: 1 1 0 0 9: 1 0 0 1 8: 1 0 0 0 9: 1 0 0 1 15: 1 1 1 1 为1的个数 5 3 2 4 对应位置如果得到的数目大于等于k,则返回1,否则为0 最终会返回: 1 0 0 1 = 9
时间复杂度:O(nlogU),其中 n 为nums 的长度,U=max(nums)
空间复杂度:O(1)
。
class Solution {
public int findKOr(int[] nums, int k) {
// 7: 0 1 1 1
// 12: 1 1 0 0
// 9: 1 0 0 1
// 8: 1 0 0 0
// 9: 1 0 0 1
// 15: 1 1 1 1
// 为1个数 5 3 2 4
// 对应位置如果得到的数目大于等于k,则返回1,否则为0
// 最终会返回: 1 0 0 1 = 9
int result = 0;
for(int i = 0; i < 31; i++){ // 遍历每一位
int count = 0;// 记录当前位 为1的个数
for(int num: nums){
if((num >> i & 1) == 1){// 如果第 i 个比特位上为1 count+1
count+=1;
}
}
if(count >= k){ // 对应位置如果得到的数目大于等于k,则返回1,否则为0
result |= 1 << i; // 1向左移位i位, 之后result与其 【按位或赋值】
}
}
return result;
}
}