刷LeetCode的小Tips

整数运算

四则运算

// 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,即可完成快速运算a*b = a* (b1+b2+b3+\cdots ) \\ let\, a=5,b=10\\ then\, b=(1010)_b,a*b = a*(1000+0010)_b=a*(2^3+2^1)

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;
}

快速幂

原理和快速乘类似,把相加变成相乘

a^b=a^{(b1+b2+b3+\dots)}\\ let\, a=2,b=10\\ then\, b=(1010)_b,a^b = a^{(1000+0010)_b} = a^{(2^3+2^1)}

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');
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值