持续创作,加速成长!这是我参与「掘金日新计划 · 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;
}
}