LC简单题1
题目描述:2的幂
给定一个整数n,如果它是2的幂,返回true;否则返回false;
(1)如果这个数小于0,那么一定不是2的幂
(2)如果是2的幂,那么二进制的表示必然为最低位为0,也就是1+若干个0的形式
(3)比如:10000 -> 减去1就成为:01111 ->也就是:10000 & 011111 = 00000
AC:
//code:
class Solution {
public:
bool isPowerOfTwo(int n) {
return (n > 0) && (n & (n - 1)) == 0;
}
};
!!!
LC简单题2
题目描述:4的幂
给定一个数n,如果它是4的幂,返回true;否则返回false;
(1)首先4的幂一定是2的幂,但2的幂不一定是4的幂
(2)归纳得,2的偶数次幂模3等于1,22x mod 3 = 1 ;
2的奇数次幂模3 等于2 ,22x+1 mod 3 = 2 。
(3)然而,,2的偶数次幂模3,22xmod 3 =1,就是相当于 4x mod 3 = 1 ;
(4)于是一个数只要满足是2的幂,并且模3等于1就一定是4的幂。
AC:
//code:
class Solution {
public:
bool isPowerOfFour(int n) {
return (n > 0) && (n & (n - 1))== 0 && n % 3 == 1;
}
};
!!!
LC简单题3
题目描述:位1的个数
编写一个函数,输入是一个无符号整数,返回其二进制表达式中数字位为“1”的个数。
(1)首先,任何一个数的二进制都是由0和1组成
(2)那么假设存在一个数为……10000,对其进行减1,得……01111,再将这两个数相与,进行&操作,得……00000。这样就达到消去1的效果
(3)知道n变为0,终止循环。
AC:
//code:
class Solution {
public:
int hammingWeight(uint32_t n) {
int c = 0; //定义一个计数器,记录消去1的个数
while(n) {
n &= (n - 1); //进行位消去,消去1
c ++; //每消去一个1,就进行计数
} //知道1被消除完,n为0时,终止循环
return c; //返回删除1的次数,即1的个数
}
};
!!!
LC简单题4
题目描述:交换数字
编写一个函数,不用临时变量,交换 a 与 b 的值。
1.涉及的算法:
a = a ^ b;
b = a ^ b;
a = a ^ b;
2.异或运算de运算规则(举例说明):
520 ^ 520 = 0 //相同的数异或为0
1314 ^ 0 = 1314 //任何数异或0为该数字本身
1314 ^ 520 = 520 ^ 1314; //满足交换律
(1 ^ 2 ) ^ 3 = 1 ^ (2 ^ 3); //满足结合律
3.最后,算法推导公式:
a = a ^ b;
b = a ^ b = a ^ b ^ b = a ^ 0 = a;
a = a ^ b = a ^ b ^ a = a ^ a ^ b = 0 ^ b = b;
AC:
//code:
class Solution {
public:
vector<int> swapNumbers(vector<int>& a) {
a[0] = a[0] ^ a[1];
a[1] = a[0] ^ a[1];
a[0] = a[0] ^ a[1];
return a;
}
};
!!!
LC简单题5
题目描述:交换数字
给定一个非空整数数组,除了某个数字只出现一次以外,其余每个数字均出现两次。找出那个只出现一次的数字。
根据上一个题的异或运算规则,知道了异或运算:
520 ^ 520 = 0 //相同的数异或为0
1314 ^ 0 = 1314 //任何数异或0为该数字本身
1314 ^ 520 = 520 ^ 1314; //满足交换律
(1 ^ 2 ) ^ 3 = 1 ^ (2 ^ 3); //满足结合律
a[0] ^ a[1] ^ a[2] ^ a[3]^……………………………………最终相互抵消,只剩下那个只出现一次的数字
AC:
//code:
int singleNumber(int* nums, int numsSize){
int i;
int sum = 0;
for(i = 0;i < numsSize; i++) {
sum =sum ^ nums[i]; //将数组中每一个数都进行异或
}
return sum;
}