主要内容为学习算法,刷 LeetCode 过程的记录,很大程度上参考了 九章算法 的代码和讲稿,非常感谢,同时也参考了一些其他教材和优质博客,尽量找出通俗易懂较为优质的AC代码。本人非专业ACMer,代码中如有不足,欢迎批评指正。当前仅有部分题解,持续更新中...,欢迎Fork or Star
LintCode 刷题记录参见另一仓库 >>> techflowing/LintCode
为区分题目,类名称 未遵循 Java 大驼峰命名规范,统一采用 题目难度_编号_题目名称 方式,如 E_001_APlusB
题目难度说明:
- E:简单
- M:中等
- H:困难
注释说明:
- 类注释:描述题目信息
- 方法注释:描述解题思路
代码示例:
/**
 * 给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
 */
public class E_001_APlusB {
    public static void main(String[] args) {
        System.out.println(new E_001_APlusB().aplusb(10, 63));
    }
    /**
     * 异或运算又称为 不进位加法
     * a^b 表示为 a+b 后,该进位的地方不进位的结果
     * 然后考虑哪些地方需要进位,(a和b里都是1的位置)
     * a&b 表示a和b中都是1的位置,(a&b)<<1 既表示进位后的结果
     * 所以:a + b = (a ^ b) + (a & b << 1)
     * 在进位变为0的时候,表示运算结束
     */
    public int aplusb(int a, int b) {
        if (b == 0) {
            return a;
        }
        int noCarrySum = a ^ b;
        int carry = (a & b) << 1;
        return aplusb(noCarrySum, carry);
    }
}