刷题的日常-数组元素积的符号

65 阅读2分钟

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

刷题的日常-2022年10月27号

一天一题,保持脑子清爽

数组元素积的符号

来自leetcode的 1822 题,题意如下:

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

如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。

返回 signFunc(product) 。

理解题意

通过题意,我们可以将信息整理如下:

  • 题目给出一个数组,并且给出一系列的规则,要求我们返回根据规则计算出来的结果
  • 其实规则无非是要我们对数组内的数的乘积进行转换,正数为1,负数为-1,0则返回0
  • 从规则可以发现
    • 如果数组中出现了0,结果肯定为0
    • 统计数组中的负数个数,如果是偶数,则为1,否则为-1
  • 结合以上规律之后我们就可以进行解题了

做题思路

直接根据理解题意之后的规则进行解题即可,遍历整个数组,如果出现0,则直接返回0,否则统计负数的个数。最终如果是偶数,返回1,奇数返回-1,步骤如下:

  • 开辟一个变量用于保存当前统计结果
  • 遍历数组
  • 如果出现数字0,直接返回结果
  • 如果没有出现0,则计算乘积,这里可以统计负数出现的次数,也可以用乘积来表示,所以就直接用乘法去做了
  • 循环完成之后返回结果

代码实现

代码实现如下,因为只需要遍历一次数组,所以时间复杂度为O(n):

public class Solution {
    public int arraySign(int[] nums) {
        int res = get(nums[0]);
        for (int i = 1; i < nums.length; i++) {
            res *= get(nums[i]);
            if (res == 0) {
                return 0;
            }
        }
        return res;
    }
    private int get(int num) {
        if (num == 0) {
            return 0;
        }
        return num > 0 ? 1 : -1;
    }
}

image.png