剑指 Offer 64 求1+2+…+n
int sumNum = 0;
public int sumNums(int n) {
//短路效应 只要n小于等于1,sumNums(n-1) > 0就不会执行
boolean x = (n > 1) && sumNums(n-1) > 0;
return sumNum += n;
}
剑指 Offer 56 - II 数组中数字出现的次数 II
public int singleNumber2(int[] nums) {
int[] count = new int[32];
for (int num : nums) {
for (int i = 0; i < 32; i++) {
count[i] += num & 1;
num >>= 1;
}
}
int res = 0;
for (int i = 31; i >= 0; i--) {
//先左移是为了保留计算结果
res <<= 1;
res |= count[i] % 3;
}
return res;
}
剑指 Offer 56 - I 数组中数字出现的次数
public int[] singleNumbers(int[] nums) {
int res = 0;
for (int num : nums) {
res ^= num;
}
int mask = 1;
for (int i = 0; i < 32; i++) {
if ((res&mask) == mask) {
break;
}
mask <<= 1;
}
int res1 = 0, res2 = 0;
for (int num : nums) {
if ((num & mask) == mask) {
res1 ^= num;
} else {
res2 ^= num;
}
}
return new int[]{res1,res2};
}
剑指 Offer 65 不用加减乘除做加法
//用异或和与运算实现
public int add(int a, int b) {
//不为0表示还有进位
while (b != 0) {
int temp = b;
//进位
b = (a & b) << 1;
//没有进位的和
a = (a ^ temp);
}
return a;
}
剑指 Offer 53 - II 0~n-1中缺失的数字
public int missingNumber(int[] nums) {
int res = 0;
int length = nums.length;
for (int i = 0; i < length; i++) {
res ^= nums[i] ^ i;
}
return res ^ length;
}
剑指 Offer 15 二进制中1的个数
public int hammingWeight(int n) {
int mask = 1, res = 0;
for (int i = 0; i < 32; i++) {
if ((mask & n) == mask) {
res++;
}
mask <<= 1;
}
return res;
}
汉明距离
public int hammingDistance(int x, int y) {
int a = x ^ y;
int mask = 1;
int res = 0;
for (int i = 0; i < 32; i++) {
if ((a & mask) == mask) {
res++;
}
a <<= 1;
}
return res;
}
比特位计数
public int[] countBits(int n) {
int[] dp = new int[n+1];
dp[0] = 0;
for (int i = 1; i <= n; i++) {
if (i % 2 == 1) {
dp[i] = dp[i - 1] + 1;
} else {
dp[i] = dp[i/2];
}
}
return dp;
}
只出现一次的数字
public int singleNumber(int[] nums) {
int res = nums[0];
for (int i = 1; i < nums.length; i++) {
res ^= nums[i];
}
return res;
}
二进制求和
public String addBinary(String a, String b) {
int length = a.length();
int length1 = b.length();
char[] chars = a.toCharArray();
char[] chars1 = b.toCharArray();
int i = length - 1, j = length1 - 1;
StringBuffer sb = new StringBuffer();
int carry = 0;
int curSum = 0;
while (i >= 0 || j >= 0 || carry > 0) {
int c = i >= 0 ? chars[i] - '0' : 0;
int d = j >= 0 ? chars1[j] - '0' : 0;
curSum = c + d + carry;
//是否有进位
carry = curSum >= 2 ? 1 : 0;
//有进位就减2
curSum = carry == 1 ? curSum -= 2 : curSum;
sb.append(curSum);
i--;
j--;
}
return sb.reverse().toString();
}