Discuss / Java / 看很多人第二问都是两个for,其实等差数列可以直接套公式算出全部和的值...

看很多人第二问都是两个for,其实等差数列可以直接套公式算出全部和的值...

Topic source

怎么排版这么乱。。

static int findMissingNumber(int start, int end, List<Integer> list){
    float sum = (start + end) * (((float) (end - start + 1)) / 2);
    int all = 0;
    for(Integer i:list)
        all += i;
    return (int) (sum - all);
}

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你的算法是对的,代码是错的。

堕天使is

#3 Created at ... [Delete] [Delete and Lock User]

因为程序浮点数的保存格式,所以这里不应该强制转换成int。我建议直接第一句改成下面的,不用float。

int sum = (start + end) * (end - start + 1) / 2;

关键是证明这个语句一定是2的倍数,如下:

  • start奇数,end奇数:start+end为偶数
  • start偶数,end奇数:end-start+1为偶数
  • start奇数,end偶数:end-start+1为偶数
  • start偶数,end偶数:start+end偶数

综上,sum一定会是一个由完整的int转换得到的int,而不是float截断的int,完全不需要用float。

A-black_soil

#4 Created at ... [Delete] [Delete and Lock User]
static int findMissingNumber(int start, int end, List<Integer> list) {
		int total = ((start+end)*(end-start+1))/2;
		System.out.println(total);
		int sum = 0;
		for (Integer itemInteger :list) {
			sum+= itemInteger;
		}
		System.out.println(sum);
		return total - sum;        
    }

  • 1

Reply