整数运算
四则运算
// a / b 向上取整
int res = (a + b - 1) / b;
// 移除数字num二进制表示中最右侧的1
num = num & (num - 1);
//判断数字a、b的奇偶性是否相同
a % 2 == b % 2
快速乘
a * b,对于乘数b来说,势必可以拆成2进制
假设b的二进制表示为(b1b2b3……)b
设立一个ans=0用于保存答案,每一位让a*=2,- 上此时的a,即可完成快速运算
public int quickMutiply(int a,int b,int mod) { //从b的最低位开始运算
int res = 0;
int add = a;
while(b > 0) {
if((b & 1) != 0) { //如果当前二进制位不为0,就加上add
res = (res + add) % mod;
}
add = (add + add) % mod; //每次相加后,add都要*2
b >>= 1; //b向右移动一位
}
return res;
}
快速幂
原理和快速乘类似,把相加变成相乘
public int quickPow(int a,int b) {
int res = 1;
int mul = a;
while(b > 0) {
if((b & 1) != 0) {
res *= mul;
}
mul *= mul; //容易溢出
b >>= 1;
}
return res;
}
public int quickPow(int a,int b,int mod) {
int res = 1;
int mul = a;
while(b > 0) {
if((b & 1) != 0) {
res = quickMutiply(res,mul,mod);
}
mul = quickMutiply(mul,mul,mod);
b >>= 1;
}
return res;
}
字符串
字符串的技巧大多是位运算相关,是很典型的用空间换时间的思想,将字符串转换成可直接进行计算的数据类型。
判断两个字符串是否存在公共字符
利用位运算的思想,用一个数的26位分别表示字符串是否含有该字符(1表示存在,0表示不存在)
例如,abd的二进制表示为(1011)b,bd的二进制表示为(1010)b
因此,如果两个字符串不存在公共字母,那么它们的二进制表示数的与运算(&)的结果应该为0
int mask = 0;
String word = "abcdfg";
for (int i = 0; i < word.length(); i++) {
mask |= 1 << (word.charAt(j) - 'a');
}