原题链接

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

示例1

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

示例2

输入:n = 3
输出:[-1,0,1]

示例3

输入:n = 1
输出:[0]

提示:

  • 1 <= n <= 1000


我的答案

Problem: 1304. 和为零的 N 个不同整数

思路

题目相对宽松所以主要利用相反数为原理(即两侧相加等于0)进行解答。

解题方法

如果n为偶数个那么就用(n/2)当作初始数组的个数
如果n为奇数个那么就用(n-1/2)当作初始数组的个数
因为n<=1000,所以我们随机取1-500即可(因为运用相反数)。
最后循环初始数组,把每一个数对应的相反数进行追加。
如果n为奇数,在循环追加的数组最后一个key(就是n本身)追加0(因为我们取随机数从1-500取的所以0是为了n为奇数存在预留出来的)。
代码公共部分可以提取简化

Code


class Solution {

    /**
     * @param Integer $n
     * @return Integer[]
     */
    function sumZero($n) {
        if($n==1){
            return [0];
        }
        //如果是偶数个
        if($n%2==0){
                $half = $n/2;
                //range 是将1000到9999 列成一个数组
                $numbers = range (1,500);
                //shuffle 将数组顺序随即打乱
                shuffle ($numbers);
                //array_slice 取该数组中的某一段
                $result = array_slice($numbers,0,$half);
                foreach($result as $k=>$v){
                    $result[$k+$half] = -$result[$k];
                }
            return $result;
        }else{
                $half = ($n-1)/2;
                //range 是将1000到9999 列成一个数组
                $numbers = range (1,500);
                //shuffle 将数组顺序随即打乱
                shuffle ($numbers);
                //array_slice 取该数组中的某一段
                $result = array_slice($numbers,0,$half);
                foreach($result as $k=>$v){
                    $result[$k+$half] = -$result[$k];
                }
                $result[$n] = 0;
            return $result;

        }
    }
}

其他php答案