leetcode-面试题64.求1+2+...+n

思路

求1+2+…+n,首先想到的便是:

  • for循环至n,逐项求和(需要用for循环)
  • 用等差数列求和公式(需要用乘除法、条件判断语句)

题目中要求“不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)”,以往的学习积累中想到:

  • for循环可以用递归实现(着重练习递归)
  • 位运算符的左右移可以实现加减乘除:用位运算实现四则运算之加减乘除
  • 逻辑运算符&&||具有短路的性质:一分钟搞懂逻辑运算符&(并且) , |(或者) , !(非) , ^(异或) , &&(短路与) , ||(短路或)之间的关系
    { 表 达 式 1 & & 表 达 式 2 表达式1若为false则表达式2不进行计算直接返回false 表 达 式 1 ∣ ∣ 表 达 式 2 表达式1若为true则表达式2不进行计算直接返回true \begin{cases} 表达式1\&\& 表达式2 &&&\text{表达式1若为false则表达式2不进行计算直接返回false} \\表达式1||表达式2 &&&\text{表达式1若为true则表达式2不进行计算直接返回true} \end{cases} {1&&212表达式1若为false则表达式2不进行计算直接返回false表达式1若为true则表达式2不进行计算直接返回true
    但其实还是不知道该怎么做…略一遍题解发现是用逻辑运算符实现递归,直到条件为flase时就不再计算。
1. 递归
class Solution {
    public int sumNums(int n) {
        boolean flag = n>0 && (n+=sumNums(n-1))>0; 
		return n;
    }
}
2. 等差数列求和公式

利用等差数列求和公式 S = n × ( n + 1 ) 2 {S}=\frac{n\times(n+1)}{2} S=2n×(n+1),其中除以2的操作可用右移一位代替,乘法同样用位运算解决。

class Solution {
    public int sumNums(int n) {
        int ans = 0, A = n, B = n + 1;
        boolean flag;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        flag = ((B & 1) > 0) && (ans += A) > 0;
        A <<= 1;
        B >>= 1;

        return ans >> 1;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值