求1+2+…+n的特殊算法


剑指Offer的题目,有点意思

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

示例 1:

输入: n = 3
输出: 6

示例 2:

输入: n = 9
输出: 45

限制:

  • 1 <= n <= 10000

算法1:

对于Java,可以使用Stream,一句话搞定:

class Solution {
    public int sumNums(int n) {
        return IntStream.rangeClosed(1,n).sum();
    }
}
IntStream.rangeClosed(1,n)产生一个1,2,3直到n的整数流,sum()方法直接求和。

算法2:

对于C这样的比较低级的高级语言,可以用递归来实现。

Java递归的算法:

class Solution {
    
    private int result = 0;
    public int sumNums(int n) {
        boolean flag = n>1 && sumNums(n-1) > 0;
        result += n;
        return result;
    }
}

递归的方法不好理解,要点:

当n>1成立时会执行sumNums(n-1) > 0;

当n>1不成立就不会执行sumNums(n-1) > 0,从而不使用if也能终止递归过程。

算法3:利用Arrays.setAll()函数

在填充数组的同时,把数组的下标号累加,从而实现求和。

Java代码如下:

class Solution {
    
    private static int sum = 0;

    public int sumNums(int n) {
        sum = 0;
        int[] array = new int[n+1];  //准备数组
        Arrays.setAll(array, ind -> {
            sum += ind;  //累加索引号
            return ind;
        });
        return sum;
    }
}

算法4:利用Math.pow()和位运算

总和 = n * (n+1) /2 = (n*n + n) / 2

可以利用Math.pow()求平方;

利用位运算做除法;

利用(int)把浮点数变成整数;

Java代码如下。这个运算速度最快!

class Solution {
    
    public int sumNums(int n) {
        return (int) (Math.pow(n, 2) + n + 0.5) >> 1;
    }
}