LeetCode解题(1)&& 短路实现阶乘、逻辑运算实现加法

前言

LeetCode确实是改变了我的解题思维

&& 短路实现 阶乘

求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)

实现思路:
题目控制了诸多循环的关键字,那么就要递归写
(虽然递归性能不如循环)

A && B 运算符有短路特性
A为true,还要运算B,那么把A当做循环里的判断语句,B为循环的方法体,执行n=n+(n-1),修改n值
A为false,直接跳过B,实现代码结束

Java里必须满足AB为boolean值

具体实现:

    public static int test(int n){
        boolean b=(n > 0) && ((n += test(n - 1)) > 0);
        return n;
    }

逻辑运算实现加法

写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。

实现思路:
在二进制中,一位只有0 和 1 ,逻辑运算也是通过判断0,1(true/false),就可以使用逻辑运算替代加法

在二进制加法:0+0=0,1+0=1,而1+1=10(最后一位是0)
这就想到了逻辑运算中的异或:a异或b,a、b相同为0(false),a、b不同为1(true),只是异或没有判断进位;

而进位类似与运算:a与b,只有a、b都为1才得1,但是与只得到了1,还要左移一位 << 1;

那么 进位+余数 不就是加法了吗,“进位”“余数”又是a,b,新一轮的加法,直到没有进位就结束

具体实现:

    public static int add(int a, int b){
        while (b != 0) {
            int temp = a ^ b;   //相加各位的值
            b = (a & b) << 1;   //计算进位的值
            a = temp;   //让a作为temp(相加各位的值的结果),再和b(进位)去异或,就是相加操作,只要进位不为0,这个循环就一直进行下去
        }
        return a;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值