class Solution {
public:
int findComplement(int num) {
if(num==0) return 1;
long n = 1;
while(n<=num){
n<<=1;
}
return (n-1)^num;
}
};
法一:
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans=0;
while(n>0){
ans+=n&1;
n=n>>1;
}
return ans;
}
};
计算一位就右移一位,使用 & 来判断是否当前位为 1 。
法二:
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
};
使用位与来消除最末位的 1。
class Solution {
public:
int hammingWeight(uint32_t n) {
int ans = 0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
};
同上。
class Solution {
int cal(int n){
int ans = 0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
public:
int hammingDistance(int x, int y) {
return cal(x^y);
}
};
仍然同上,先异或两个数然后再求位 1 个数即可。
class Solution {
int cal(int n){
int ans = 0;
while(n){
n&=(n-1);
ans++;
}
return ans;
}
public:
int minBitFlips(int start, int goal) {
return cal(start^goal);
}
};
其实这题和上一题是一样的,翻转只需要翻转不同的位即可。
class Solution {
public:
int numberOfSteps(int num) {
int ans=0;
while(num){
if(num&1){
num--;
}else{
num/=2;
}
ans++;
}
return ans;
}
};
直接使用循环即可。
class Solution {
public:
int kthFactor(int n, int k) {
int i = 0;
int ans = 1;
while(ans<=n){
if(n%ans==0){
++i;
if(i==k){
return ans;
}else{
ans++;
}
}else{
ans++;
}
}
return -1;
}
};
使用了一堆的判断进行处理,不过效率还可以。
class Solution {
public:
int countKDifference(vector<int>& nums, int k) {
int ans = 0;
int size = nums.size();
for(int i = 0;i<size;++i){
for(int j = i+1;j<size;++j){
if(abs(nums[i]-nums[j])==k){
ans++;
}
}
}
return ans;
}
};
class Solution {
public:
vector<int> getConcatenation(vector<int>& nums) {
int n = nums.size();
for(int i = 0;i<n;++i){
nums.push_back(nums[i]);
}
return nums;
}
};
直接将原来的元素按顺序在往原数组的后面填入就可以了。
class Solution {
public:
string defangIPaddr(string address) {
string ans;
for(int i = 0;i<address.size();++i){
if(address[i]=='.'){
ans+="[.]";
}else{
ans+=address[i];
}
}
return ans;
}
};
string类确实比char数组好用多了。