飞道的博客

【算法集训暑期刷题营】7.5题---位运算

290人阅读  评论(0)

算法集训传送门

  👉引言

铭记于心
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉

💖 ❄️我们的算法之路❄️💖

   众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
              ☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
   💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs),💝宽度优先搜索(bfs),💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉


今日主题:位运算


 👉⭐️第一题💎

   ✨题目

      1.二进制间距

   ✨思路

循环进行右移运算,遇到1则记录距离,取较大值,同时将计数器清零

   ✨代码

class Solution {
   
public:
    int binaryGap(int n) {
   
        int m=0,time=0;
        while(!(n&1)){
   n>>=1;}
        while(n){
   
            if(n&1){
   
                m=max(time,m);
                time=0;
            }
            time++;
            n>>=1;
        }
        return m;
    }
};

 

 👉⭐️第二题💎

   ✨题目

      2.位1的个数

解法一:循环右移,遇1计数
解法二:通过n&(n-1)消去最右位置的1

   ✨代码

class Solution {
   
public:
    int hammingWeight(uint32_t n) {
   
        int num=0;
        while(n){
   
            if(n&1)num++;
            n>>=1;
        }return num;
    }
};
  • 解法二:
class Solution {
   
public:
    int hammingWeight(uint32_t n) {
   
        int t=0;
        while(n!=0)
        {
   
            n&=(n-1);
            t++;
        }
        return t;
    }
};

 👉⭐️第三题💎

   ✨题目

      3.只出现一次的数字

   ✨思路

已知两个相同的数异或得0,所以将数组中的数全部异或一遍,最终得到的即是出现一次的数

   ✨代码

class Solution {
   
public:
    int singleNumber(vector<int>& nums) {
   
        int n=0;
        for(int i=0;i<nums.size();i++){
   
            n^=nums[i];
        }return n;
    }
};

 👉⭐️第四题💎

   ✨题目

      4.K-th Not Divisible by n

给你三个整数a,b,c,请你找出三个整数x,y,z。使得满足x%y=a,y%z=b,z%x=c。可以保证一定存在答案

   ✨代码

#include <bits/stdc++.h>

using namespace std;

int main() {
   
	int t;
	cin >> t;
	while (t--) {
   
		int n, k;
		cin >> n >> k;
		int need = (k - 1) / (n - 1);
		cout << k + need << endl;
	}
}

写在最后
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫
漫其修远兮,吾将上下而求索!伙伴们,明天见!


转载:https://blog.csdn.net/runofsun/article/details/125646648
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场