找出中枢整数

148 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第31天,点击查看活动详情

题目描述

给你一个正整数 n ,找出满足下述条件的 中枢整数 x :
1 和 x 之间的所有元素之和等于 x 和 n 之间所有元素之和。 返回中枢整数 x 。如果不存在中枢整数,则返回 -1 。题目保证对于给定的输入,至多存在一个中枢整数。
来源:力扣(LeetCode)

  • 示例 1
输入: n = 8
输出: 6
解释: 6 是中枢整数,因为 1 + 2 + 3 + 4 + 5 + 6 = 6 + 7 + 8 = 21
  • 示例 1
输入: n = 1
输出: 1
解释: 1 是中枢整数,因为 1 = 1
  • 示例 1
输入: n = 4
输出: -1
解释: 可以证明不存在满足题目要求的整数。

提示:

  • 1 <= n <= 1000

思路分析

根据题意可知,题目给出一个正整数n,需要在小于这个正整数的区间内找出中枢整数x。啥是中枢整数x呢?如果1到x之间的所有元素之和等于x到n之间的所有元素之和,那么正整数x就是中枢整数。存在的话就返回x;如果正整数n里面不存在中枢整数x,就返回-1。正整数n中,最多只有一个中枢整数。
首先声明两个变量,用于存存储中枢整数x左边的所有元素之和leftTotal以及中枢整数x右边的所有元素之和rightTotal。根据数学知识可以计算出1到n所有元素的总数total。题目中说了,中枢整数的左边的所有元素之和会等于中枢整数右边的所有元素之和,也就是说total / 2 = leftTotal + x = rightTotal + x,即leftTotal等于rightTotal;利用for循环,对n之前的整数进行循环,每次都累加元素,每次都判断leftTotal是否等于rightTotal,若是相等的话,那么此时的元素i就是中枢整数了。可以将它返回出去。

AC代码

function solution(num) {
    let total = (1 + num) * num / 2;
    let leftTotal = 0;
    let rightTotal = 0;
    for(let i = 1; i <= num; i++) {
        leftTotal += i;
        rightTotal = total - leftTotal + i;
        if(leftTotal === rightTotal) {
            console.log(i)
            return i;
        }
    }
    console.log(-1)
    return -1;
};
let num = 4;
solution(num)