和为零的N个唯一整数 2022-02-25 周五

题目

给你一个整数 n,请你返回 任意 一个由 n 个 各不相同 的整数组成的数组,并且这 n 个数相加和为 0 。

  • 示例 :
    输入:n = 5
    输出:[-7,-1,1,3,4]
    解释:这些数组也是正确的 [-5,-1,1,2,3],[-3,-1,2,-2,4]。

思路

  • 因为和为零,所以最容易想到的就是成对给正负数

  • 如果n是偶数,那么就好了;因为是成对的;

  • 如果n是奇数,那么最后一个给0;

C代码

/**
 * Note: The returned array must be malloced, assume caller calls free().
 */
int* sumZero(int n, int* returnSize) {
    // 申请n个位置
    int* sumArray = (int *)malloc(sizeof(int) * n);
    // 下标从0开始
    (*returnSize) = 0;

    // 成对添加正负数
    for(int i=1; i<= n/2; i++) {
        sumArray[*returnSize] = i;
        (*returnSize)++;
        sumArray[*returnSize] = -i;
        (*returnSize)++;
    }

    // n为奇数,最后一个补零
    if ((n%2) != 0) {
        sumArray[*returnSize] = 0;
        (*returnSize)++;
    }

    // 返回数组;* returnSize的值最终都是n,不论n是奇数还是偶数
    return sumArray;
}

思路2

  • 特殊情况处理;n==0时,给[]; n==1时,给[0];

  • 前面n-1个数,就从1开始顺序添加,并且累加求和sum

这里不能从0开始;当n=2时,结果是[0, 0]就不对了;

  • 最后一个数给对应的负数-sum就可以了

JS代码

/**
 * @param {number} n
 * @return {number[]}
 */
var sumZero = function(n) {
    let sumArray = [];
    let sum = 0;

    // 前面n-1个数顺序添加,并求和
    for (let i=1; i < n; i++) {
        sumArray.push(i);
        sum += i;
    }

    // 最后一个添加和的相反数,保证最终的和为0
    sumArray.push(-sum);

    // 返回构造的数组
    return sumArray;
};

选择

练习算法,用C语言,性能最好;用JS,语法最随意;
图省事的话,直接上JS好了;

你可能感兴趣的:(和为零的N个唯一整数 2022-02-25 周五)