栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

leet code c语言 简单位运算

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

leet code c语言 简单位运算

收获 :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 ret=0;
    for(int i=0;i<32;i++){
        int cnt=0;
        for(int j=0;j>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 。题目保证答案存在且唯一。

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/969135.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号