数组元素积的符号

117 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情

🎈算法并不一定都是很难的题目,也有很多只是一些代码技巧,多进行一些算法题目的练习,可以帮助我们开阔解题思路,提升我们的逻辑思维能力,也可以将一些算法思维结合到业务代码的编写思考中。简而言之,平时进行的算法习题练习带给我们的好处一定是不少的,所以让我们一起来养成算法练习的习惯。今天练习的题目是一道比较简单的题目 -> 数组元素积的符号

题目描述

已知函数 signFunc(x) 将会根据 x 的正负返回特定值:

  • 如果 x 是正数,返回 1 。
  • 如果 x 是负数,返回 -1 。
  • 如果 x 是等于 0 ,返回 0 。

给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

示例 1:

输入:nums = [-1,-2,-3,-4,3,2,1]
输出:1
解释:数组中所有值的乘积是 144 ,且 signFunc(144) = 1

示例 2:

输入:nums = [1,5,0,2,-3]
输出:0
解释:数组中所有值的乘积是 0 ,且 signFunc(0) = 0

示例 3:

输入:nums = [-1,1,-1,1,-1]
输出:-1
解释:数组中所有值的乘积是 -1 ,且 signFunc(-1) = -1

提示:

  • 1 <= nums.length <= 1000
  • -100 <= nums[i] <= 100

思路分析

首先我们要先理解一下题目的意思,题目会给我们一个数组,我们需要统计数组乘积的正负性,我们知道,对于多个数字乘积的正负性,只和数组中负数数字的个数有关,负数数字的个数为偶数是,由于负负得正,最后的结果将会是整数;而且0乘以任何数都会等于0,所以遇到0的时候我们直接返回0即可。

所以我们有两种做法:

  • 1、直接算出乘积

因为正负性与数值大小并没有关系,所以我们可以不用考虑数值,统一化成 1 或 -1 来进行计算即可。

let res = 1;
for(const num of nums){
    if(num == 0) return 0;
    res *= (num > 0) ? 1 : -1;
}
return res;
  • 2、统计负数个数

可以直接统计负数的个数,最后判断负数个数的奇偶性就可以得到其乘积的正负性。

let res = 0;
for(const num of nums){
    if(num == 0) return 0;
    res += (num > 0) ? 0 : 1;
}
return res % 2 == 1 ? -1 : 1;

完整AC代码如下:

AC代码

/**
 * @param {number[]} nums
 * @return {number}
 */
var arraySign = function(nums) {
    let res = 1;
    for(const num of nums){
        if(num == 0) return 0;
        res *= (num > 0) ? 1 : -1;
    }
    return res;
};

说在后面

🎉这里是JYeontu,喜欢算法,GDCPC打过卡;热爱羽毛球,大运会打过酱油。毕业一年,两年前端开发经验,目前担任H5前端开发,算法业余爱好者,有空会刷刷算法题,平时喜欢打打羽毛球🏸 ,也喜欢写些东西,既为自己记录📋,也希望可以对大家有那么一丢丢的帮助,写的不好望多多谅解🙇,写错的地方望指出,定会认真改进😊,在此谢谢大家的支持,我们下文再见🙌。