leet code c语言 简单位运算

leet code c语言 简单位运算,第1张

收获 :a^a=0;        a^0=a;        a^b^a=b;        a^(b^c)=(a^b)^c;        x & ~x = 0;        x & ~0 = x;

一 、191. 位1的个数

编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 '1' 的个数(也被称为汉明重量)。

int hammingWeight(uint32_t n) {
    int x=0;
    while(n){
        if(n&1==1) x++;
        n>>=1; 
    }
    return x;
}

思路 :简单的遍历 每次记录 1的个数.

二 、461. 汉明距离

两个整数之间的 汉明距离 指的是这两个数字对应二进制位不同的位置的数目。

给你两个整数 x 和 y,计算并返回它们之间的汉明距离。

int hammingDistance(int x, int y){
    int count=0;
   int n=x^y;
   while(n){
       if(n&1) count++;
       n>>=1;
   }
   return count;
}

思路 :首先 明白汉明距离 说什么意思  将这两个数 异或 再循环找但1的个数 .

三 、136. 只出现一次的数字

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

int singleNumber(int* nums, int numsSize){
    int s=0;
    for(int i=0;i

思路 :首先直接循环进行异或,那么剩下的就是多的数  就是.

四、只出现一次的数字 II

给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。

/*int singleNumber(int* nums, int numsSize){
    int a=0,b=0;
    for(int i=0;i>i)&1;
        }
        if(cnt%3){
            ret+=((unsigned int )1<

思路 :第一种方法在注释里  首先得熟悉按位 *** 作  当 b=(b^nums[i])&~a;又开头可知 b=x;

 a=(a^nums[i])&~b a=0;当再次遇见相同的数时 那么b=0,a=x;第三次遇见 b=0;a=0;

所以可以将三位数解决 .

第二种方法 想象成32位二进制 每次进行第一位到31位为1的cnt++;因为每个数相同 %3那么一定为0 只有多余的那个数 才除不尽 那么 将其加到ret中。再返回其值.

五、868. 二进制间距

给定一个正整数 n,找到并返回 n 的二进制表示中两个 相邻 1 之间的 最长距离 。如果不存在两个相邻的 1,返回 0 。

如果只有 0 将两个 1 分隔开(可能不存在 0 ),则认为这两个 1 彼此 相邻 。两个 1 之间的距离是它们的二进制表示中位置的绝对差。例如,"1001" 中的两个 1 的距离为 3 。

int binaryGap(int n){
    int max=0,now=0,pre=-1;
    while(n){
        if(n&1==1){
           if(pre!=-1){
               if(max>=1;
        now++;
    }
    return max;
}

思路 :首先设两个下标 进行循环 如果n&1成立 说明遇见1 则可以进行判断最大距离(并将这次遇见的1做距离标记) 如果没遇见 那么now++.

六 、1720. 解码异或后的数组

未知 整数数组 arr 由 n 个非负整数组成。

经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encoded[i] = arr[i] XOR arr[i + 1] 。例如,arr = [1,0,2,1] 经编码后得到 encoded = [1,2,3] 。

给你编码后的数组 encoded 和原数组 arr 的第一个元素 first(arr[0])。

请解码返回原数组 arr 。可以证明答案存在并且是唯一的

int* decode(int* encoded, int encodedSize, int first, int* returnSize) {
    int* p =(int *) malloc(sizeof(int) * (encodedSize + 1));
    p[0] = first;
     *returnSize = encodedSize + 1;
    for (int i = 0; i < encodedSize; i++) {
        p[i + 1] = encoded[i] ^ p[i];
    }
    return p;
}

思路 :首先已经知道第一个原先值 那么根据  a^b=c c^b=a  所以可以进行遍历将其计算出来.

七 、1734. 解码异或后的排列

给你一个整数数组 perm ,它是前 n 个正整数的排列,且 n 是个 奇数 。

它被加密成另一个长度为 n - 1 的整数数组 encoded ,满足 encoded[i] = perm[i] XOR perm[i + 1] 。比方说,如果 perm = [1,3,2] ,那么 encoded = [2,1] 。

给你 encoded 数组,请你返回原始数组 perm 。题目保证答案存在且唯一。

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* decode(int* encoded, int encodedSize, int* returnSize){
    int *p=(int *)malloc(sizeof(int )*(encodedSize+1));
    *returnSize=encodedSize+1;
    int n=encodedSize+1;
    int x=0,y=0;
    for(int i=1;i<=n;i++){
        x^=i;
    }
    for(int i=1;i

思路 :首先没有给你第一个原先值 所以第一步就要找第一个原先值 根据官方的定义 p[0]=(1^2^3...^n)^(encoded[i]^…encode[n-2]) n为奇数 那么容易找出.

来自英雄哪里出来

题源 :leetcode

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1353651.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-14
下一篇2022-06-14

发表评论

登录后才能评论

评论列表(0条)