备赛蓝桥杯--算法题目(3)

1. 2的幂

231. 2 的幂 - 力扣(LeetCode)

复制代码
class Solution {
public:
    bool isPowerOfTwo(int n) {
        return n>0&&n==(n&(-n));
    }
};
2. 3的幂

326. 3 的幂 - 力扣(LeetCode)

复制代码
class Solution {
public:
    bool isPowerOfThree(int n) {
        return n>0&&1162261467%n==0;
    }
};
3. 数字范围按位与

201. 数字范围按位与 - 力扣(LeetCode)

复制代码
class Solution {
public:
    int rangeBitwiseAnd(int left, int right) {
        while(left<right)
        {
            right-=right&(-right);
        }
        return right;
    }
};
4. 颠倒二进制位

190. 颠倒二进制位 - 力扣(LeetCode)

复制代码
class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        n=(n&0xaaaaaaaa)>>1|(n&0x55555555)<<1;
        n=(n&0xcccccccc)>>2|(n&0x33333333)<<2;
        n=(n&0xf0f0f0f0)>>4|(n&0x0f0f0f0f)<<4;
        n=(n&0xff00ff00)>>8|(n&0x00ff00ff)<<8;
        n=n>>16|n<<16;
        return n;
    }
};
5. 汉明距离

461. 汉明距离 - 力扣(LeetCode)

复制代码
class Solution {
public:
    int hammingDistance(int x, int y) {
        int n=x^y;
        n = (n & 0x55555555) + ((n >> 1) & 0x55555555);
		n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
		n = (n & 0x0f0f0f0f) + ((n >> 4) & 0x0f0f0f0f);
		n = (n & 0x00ff00ff) + ((n >> 8) & 0x00ff00ff);
		n = (n & 0x0000ffff) + ((n >> 16) & 0x0000ffff);
		return n;
    }
};
6. 设计位集

2166. 设计位集 - 力扣(LeetCode)

复制代码
class Bitset {
private:
    std::vector<int> set;
    const int size;
    int zeros;
    int ones;
    bool reverse;

public:
    Bitset(int n) : size(n), zeros(n), ones(0), reverse(false) {
        set.resize((n + 31) / 32, 0);
    }

    void fix(int i) {
        int index = i / 32;
        int bit = i % 32;
        if (!reverse) {
            if ((set[index] & (1 << bit)) == 0) {
                zeros--;
                ones++;
                set[index] |= (1 << bit);
            }
        } else {
            if ((set[index] & (1 << bit)) != 0) {
                zeros--;
                ones++;
                set[index] ^= (1 << bit);
            }
        }
    }

    void unfix(int i) {
        int index = i / 32;
        int bit = i % 32;
        if (!reverse) {
            if ((set[index] & (1 << bit)) != 0) {
                ones--;
                zeros++;
                set[index] ^= (1 << bit);
            }
        } else {
            if ((set[index] & (1 << bit)) == 0) {
                ones--;
                zeros++;
                set[index] |= (1 << bit);
            }
        }
    }

    void flip() {
        reverse = !reverse;
        std::swap(zeros, ones);
    }

    bool all() const {
        return ones == size;
    }

    bool one() const {
        return ones > 0;
    }

    int count() const {
        return ones;
    }

     std::string toString() const {
        std::string result;
        for (int k = 0, i = 0; i < size; k++) {
            int number = set[k];
            for (int j = 0; j < 32 && i < size; j++, i++) {
                int status = (number >> j) & 1;
                status ^= reverse ? 1 : 0;
                result += std::to_string(status);
            }
        }
        return result;
    }
};
7. 两数相除

29. 两数相除 - 力扣(LeetCode)

复制代码
class Solution {
public:
static const int MIN =INT_MIN;
    int divide(int a, int b) {
        if(a==MIN&&b==MIN)
        {
            return 1;
        }
        if(a!=MIN&&b!=MIN)
        {
            return div(a,b);
        }
        if(b==MIN)
        {
            return 0;
        }
        if(b==neg(1))
        {
            return INT_MAX;
        }
        a=add(a,b<0?neg(b):b);
        int ans=div(a,b);
        int offset=b<0?1:-1;
        return add(ans,offset);
    }
    int div(int a, int b) {
		int x = a < 0 ? neg(a) : a;
		int y = b < 0 ? neg(b) : b;
		int ans = 0;
		for (int i = 30; i >= 0; i = minus(i, 1)) {
			if ((x >> i) >= y) {
				ans |= (1 << i);
				x = minus(x, y << i);
			}
		}
		return a < 0 ^ b < 0 ? neg(ans) : ans;
	}
    int add(int a,int b)
    {
        int ans=a;
        while(b!=0)
        {
            ans=a^b;
            b=(a&b)<<1;
            a=ans;
        }
        return ans;
    }
    int minus(int a,int b)
    {
        return add(a,neg(b));
    }
    int neg(int n)
    {
        return add(~n,1);
    }
    int multiply(int a, int b) {
		int ans = 0;
		while (b != 0) {
			if ((b & 1) != 0) {
				ans = add(ans, a);
			}
			a <<= 1;
			b >>= 1;
		}
		return ans;
	}
};
相关推荐
qq_466302454 分钟前
vs2022 mn矩阵运算 加减乘除
c++·算法·矩阵
sin°θ_陈5 分钟前
前馈式3D Gaussian Splatting 研究地图(总览篇):解构七大路线,梳理方法谱系,看懂关键分歧与未来趋势
论文阅读·深度学习·算法·3d·aigc·空间计算·3dgs
阿Y加油吧9 分钟前
LeetCode 双指针经典双题解|盛最多水的容器 + 三数之和,从入门到进阶吃透套路
算法·leetcode·职场和发展
B站_计算机毕业设计之家19 分钟前
计算机毕业设计:汽车数据可视化与后台管理平台 Django框架 requests爬虫 可视化 车辆 数据分析 大数据 机器学习(建议收藏)✅
python·算法·机器学习·信息可视化·django·汽车·课程设计
格林威20 分钟前
工业相机图像采集处理:从 RAW 数据到 AI 可读图像,堡盟相机 C#实战代码深度解析
c++·人工智能·数码相机·opencv·算法·计算机视觉·c#
lvxiangyu1110 小时前
MPPI 算法证明重构:基于无穷维泛函变分与 KL 散度的构造性推导
算法·重构·最优控制·随机最优控制
2301_8184190110 小时前
C++中的解释器模式变体
开发语言·c++·算法
ab15151710 小时前
3.25完成*23、*24、*28、*30、*33、*38、*39、*40
算法
颜酱10 小时前
回溯算法实战练习(3)
javascript·后端·算法
小王不爱笑13211 小时前
G1 GC 的核心基础:Region 模型的补充细节
java·jvm·算法