首页 > 其他分享 >vector oj题 和 位运算

vector oj题 和 位运算

时间:2024-06-21 20:59:56浏览次数:19  
标签:return oj nums int lowbit vector bit 运算

知识点1:

lowbit(x)

        简介:众所周知,lowbit()操作是算法竞赛中的高级技巧,特别是高级数据结构,线段树的核心,还有什么二进制与位运算题目,而本文就用最通俗易懂的话,来教会大家lowbit的含义。

        含义lowbit(x)x的二进制表达式中最低位的1所对应的值。

        一般用于删除重复项上。

        什么意思呢:

        十进制 二进制 最低位的1所对应的值对应的二进制数 最低位的1所对应的值对应的十进制数

        1 1 1 1

        2 10 10 2

        3 111 1 1
        4 100 100 4

        5 101 1 1

        6 110 10 2

        7 111 1 1

        方法:我们得到lowbit的值,只需要得到最后一个1的位置,并且把除了这个位置之外的所有位置全部置成零。然后输出就可以。

        实现代码:

int lowbit(int x)
{
    return x&(-x);
}
long lowbit(long x)
{
    return x&(-x);
}

知识点2:

         将第bit位  置1

    x |= (1<<bit)

        将第bit位  置0

    x &= ~(1<<bit)

        测试bit位是否为1

    (x&= (1<<bit))!= 0

         删除从右边起第一个为1的bit

    A & (A - 1)

        得到所有为1的bit

    ~0

        判断一个数是否是2的幂次方(只有一个bit位为1):

if(n & n - 1 == 0) return true;
else return false;

        判断一个数是否是4的幂次方

  bool isPowerOfFour(int n) 
    {
           return !(n&(n-1)) && (n&0x55555555);
    }

        判断一个十进制的数转化为二进制时包含的1的个数:

(因为每次N&(N-1)操作都是将n最末尾的1反转为0,因此反转个数即为1的个数)

public int hammingWeight(int n) 
    {
        int sum = 0;
        while(n != 0) 
        {
            sum ++;
            n &= n - 1;         
        }   
        return sum;
    }

第一题:杨辉三角

. - 力扣(LeetCode)

第二题:删除重复项

. - 力扣(LeetCode)

第三题:找出只出现一次的数

. - 力扣(LeetCode)

第四题:找出只出现一次的数

. - 力扣(LeetCode)

第一题

class Solution {
public:
    vector<vector<int>> generate(int numRows) 
    {
        vector<vector<int>> vv;
        vv.resize(numRows);
        for(size_t i=0;i<numRows;++i)
        {
                vv[i].resize(i+1,0);
                //每一行的第一个和最后一个置为1
                vv[i][0]=vv[i][i]=1;
        }
        for(size_t i=0;i<vv.size();++i)
        {
            for(size_t j=0 ;j<vv[i].size() ;++j)
            {
                if(vv[i][j]==0)
                {
                    vv[i][j]=vv[i-1][j]+vv[i-1][j-1];
                }
            }   
        }
        return vv;
    }
};

第二题

class Solution {
public:
    int removeDuplicates(vector<int>& nums) 
    {
        int fast=0;
        int slow=0;
        while(fast< nums.size())
        {
            if(nums[fast]!= nums[slow])
            {
                slow++;
                nums[slow]=nums[fast];
            }
            fast++;
        }
        return slow+1;
    }
};

第三题

class Solution {
public:
    long lowbit(long x)
    {
        return x&(-x);
    }

    vector<int> singleNumber(vector<int>& nums)
    {
        int n=0;
        for(auto e:nums)
        {
            n=n^e;
        }
        //int lowbit = n&(-n);//找到n为1的最低的bit位 lowbit()是一个宏
        int n1=0;
        int n2=0;
        for(auto x: nums)
        {
            if((x&lowbit(n)) == lowbit(n))
            {
                n1^=x;
            }
            else
            {
                n2^=x;
            }
        }
        return vector<int>{n1,n2};
    }
};

第四题

class Solution {
public:
    int singleNumber(vector<int>& nums) {
        int ans = 0;
        for (int i = 0; i < 32; ++i) {


            // 统计该每个数字第i个比特位为1的总数
            int total = 0;
            for (int num: nums) {
                total += ((num >> i) & 1);
            }


            // 如果total能够被3整除,说明只出现一次的数字在该位置上一定是0
            // 否则在该位置上一定是1
            if (total % 3) {
                ans |= (1 << i);
            }
        }
        return ans;
    }
};

标签:return,oj,nums,int,lowbit,vector,bit,运算
From: https://blog.csdn.net/m0_73751295/article/details/139844573

相关文章

  • 0基础学C++ | 第03天 | 基础知识 |算术运算符 | 赋值运算符 | 比较运算符 | 逻辑运算
    前言前面已经讲了,数据类型以及求数据类型所占的空间0基础学C++|第02天|基础知识|sizeof关键字|浮点型|字符型|转义字符|字符串|布尔类型|数据的输入-CSDN博客,现在讲运算符算术运算符 作用:用于处理四则运算#include<iostream>usingnamespacestd;in......
  • ZZULIOJ157:素数判定
    方法一:#include<stdio.h>#include<math.h>intmain(){intn,i;scanf("%d",&n);for(i=2;i<n;i++)//解题思路:一个素数只能被1和本身整除,任何数都能被1整除,所以我们将设置除数从2开始,如果除数一直递增到被除数n的前一位也就是n-1还不能被整除,那么说明输入的n为......
  • 5-基本运算符
    算数运算符+-*/%++--赋值运算符=关系运算符><>=<===!=instanceof逻辑&&||!位&|^~>><<条件?:拓展+=-=*=/=......
  • vector中下标[]操作、迭代器与size()在使用中遇到的问题
    综述:1.今天学习vector的过程中遇到的一些问题记录下来,方便日后复习以及有相同疑惑的同学参考。2.主要关于下标与迭代器写入与读取元素。遇到的问题:代码如下:#include<iostream>#include<vector>usingnamespacestd;intmain(){ unsignedinti; vector<int>v1;......
  • 第二章:变量、数据类型、运算符、表 达式
    一、变量1.概念:计算机中的一块内存空间,存储数据的基本单元2.变量的组成部分:数据类型、变量名、数据3.语法:(1)先声明,再赋值:数据类型变量名;//声明变量名=值; //赋值(2)声明的同时并赋值:数据类型变量名=值;(3)同时定义多个相同类型的变量:数据类型......
  • 【ARMv8/ARMv9 硬件加速系列 2.2 -- ARM NEON 的加减乘除(左移右移)运算】
    文章目录NEON加减乘除NEON加减乘除下面代码是使用ARMv8汇编语言对向量寄存器v0-v31执行加、减、乘以及左移和右移操作的示例。ARMv8的SIMD指令集允许对向量寄存器中的多个数据进行并行操作。v0和v1加载数据,对它们进行加、减和乘,左移和右移操作。最后,我们会将结......
  • 数论--有关模运算的巧妙
    萌萌的好数链接:https://ac.nowcoder.com/acm/contest/84851/D来源:牛客网时间限制:C/C++1秒,其他语言2秒空间限制:C/C++262144K,其他语言524288K64bitIOFormat:%lld题目描述萌萌喜欢“好数”,这种“好数“需要满足以下两个条件:1.该数对3取模不为02.该数的最后一位数字......
  • 题解:P10639 BZOJ4695 最佳女选手
    区间最值操作基础题,但是有点码农。依然考虑势能线段树,维护区间和\(\textrm{sum}\)、最大值\(\textrm{M1}\)、次大值\(\textrm{M2}\)、最大值个数\(\textrm{Mcnt}\)、最小值\(\textrm{m1}\)、次小值\(\textrm{m2}\)、最小值个数\(\textrm{mcnt}\),另外需要区间加标记\(\tex......
  • 深入了解C++运算符
    C++是功能强大的编程语言,提供了丰富的运算符集合。运算符是用于执行各种操作的符号或关键字,包括数学运算、比较、逻辑操作、位操作等。本文将详细介绍C++中的各种运算符,并通过示例说明其用法。一、算术运算符算术运算符用于执行基本的数学运算,包括加、减、乘、除和取余。......
  • 第二章 - 第1节- 逻辑运算 - 课件
    1.逻辑运算符优先级以下是C++运算符的优先级表格,从高到低排列:优先级运算符描述结合性1::作用域解析从左到右2()[]->.函数调用、数组下标、成员访问从左到右3!~++--+-*&(type)sizeof逻辑非、按位取反、自增/自减、正/负号、间接......