👉引言
铭记于心 | ||
🎉✨🎉我唯一知道的,便是我一无所知🎉✨🎉 |
💖 ❄️我们的算法之路❄️💖
众所周知,作为一名合格的程序员,算法 能力 是不可获缺的,并且在算法学习的过程中我们总是能感受到算法的✨魅力✨。
☀️🌟短短几行代码,凝聚无数前人智慧;一个普通循环,即是解题之眼🌟☀️
💝二分,💝贪心,💝并查集,💝二叉树,💝图论,💝深度优先搜索(dfs) ,💝宽度优先搜索(bfs) ,💝数论,💝动态规划等等, 路漫漫其修远兮,吾将上下而求索! 希望在此集训中与大家共同进步,有所收获!!!🎉🎉🎉
今日主题:位运算
👉⭐️第一题💎
✨题目
✨思路:
循环进行右移运算,遇到1则记录距离,取较大值,同时将计数器清零,N化成2进制然后拆成数组, 去除前面无用的0,保证第一个是0,然后遍历数组,如果是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; } };
👉⭐️第二题💎
✨题目
解法一:循环右移,遇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; } };
👉⭐️第三题💎
✨题目
✨思路:
例如对于 1来说,1^1=0; 对于2来说,二进制表示为10,按位异或就是10^10,则可知等于0,也就是说两个相同的数异或得0, 所以将数组中的数全部异或一遍,两个相同的数便会为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; } };
👉⭐️第四题💎
✨题目
给你三个整数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; } }
写在最后:
相信大家对今天的集训内容的理解与以往已经有很大不同了吧,或许也感受到了算法的魅力,当然这是一定的,路漫
漫其修远兮,吾将上下而求索!伙伴们,明天见!