可能会引起死循环的解法:
看最右边一位是不是1,然后将输入的整数右移一位,再判断最右边一位(即倒数第二位)是否为1,接着再右移,知道整数移动到0为止
这个解法,把整数右移一位和把整数除以2在数学上是等价的,但是不能换成除以2,因为除法的效率要比移位运算要低得多,实际编程中,尽可能用移位运算代替乘除法。
但是这个解法存在的问题是,输入一个负数,负数0x80000000右移一位的时候,并不是简单的把最高位的1移到第二位变成0x40000000,而是0xC00000000,因为移位前是一个负数,仍然要保证移位后是一个负数,因此移位后的最高位会设置为1,如果一直右移运算,那么最终这个数字就会变成0xFFFFFFFF而陷入死循环。
class Solution {
public:int hammingWeight(uint32_t n) {int result=0;while(n){if(n&1) result++;//判断最右边一位是否为1 n=n>>1; //n右移一位}return result;}
};
常规解法:不引起死循环,就不能右移整数n。首先n和1做位运算,判断倒数第一位是否为1,然后1右移变成2即10,做位运算,判断倒数第二位是否为1,接着2再右移一位变成4即100,判断倒数第三位是否为1.
循环的次数:整数二进制的位数,32位的整数需要循环32次,f定义为unsigned int ,因此while(f) 循环32次,同时题目中输入也必须是长度为32的二进制串
class Solution {
public:int hammingWeight(uint32_t n) {int result=0;unsigned int f=1;while(f){if(n&f) result++;//每次判断当前f在的1的位置是否为1 f=f<<1; //f左移一位}return result;}
};
把一个整数减去1,在和原整数进行位运算,会把该证书最右边的1变成0,有多少个1,进行多少次该操作
class Solution {
public:
//复杂度lognint hammingWeight(uint32_t n) {int result=0;while(n){n&=n-1;result++;}return result;}
};
class Solution {
public:bool isBalanced(TreeNode* root) {return height(root)!=-1;}
private:int height(TreeNode* root){if(!root) return 0;int left_dep=height(root->left);int right_dep=height(root->right);if(abs(left_dep-right_dep)>1||left_dep==-1||right_dep==-1) return -1;return max(left_dep,right_dep)+1;}
};
数组的整数次方
class Solution {
public:double myPow(double x, int n) {double result=1;int flag=n>0?1:0;long long N=abs(n);while(N){if(N&1) result*=x;x=x*x;N=N>>1;}if(flag==0) result=1/result;return result;}
};
超过一半的次数
class Solution {
public:int majorityElement(vector<int>& nums) {unordered_map<int,int> mp;int len=nums.size();for(int i=0;i<nums.size();i++){mp[nums[i]]++;if(mp[nums[i]]>len/2) return nums[i];}return 1;}
};