持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
前言
今天的每日一题目比较简单,但是有坑,坑藏得比较一般,一眼就看出来了。
题目
1822. 数组元素积的符号 [难度:简单]
已知函数 signFunc(x) 将会根据 x 的正负返回特定值:
如果 x 是正数,返回 1 。
如果 x 是负数,返回 -1 。
如果 x 是等于 0 ,返回 0 。
给你一个整数数组 nums 。令 product 为数组 nums 中所有元素值的乘积。
返回 signFunc(product) 。
审题
由题目可知signFunc方法会返回特定值,这个特定值就是 1 0 -1这三个基础值,其实这道题有点类似判断他是否是负数正数与0,1就是正数,0就是0,-1就是负数,这样讲是不是明了许多。一眼看过去这不就是简单的小学数学题嘛,有啥难的,好我开始了第一次的实验:
使用了stream流实现乘法
public int arraySign(List<Integer> nums) {
int result = Arrays.stream(nums).reduce((subsum, e) -> subsum * e).getAsInt();
return result == 0 ? 0 : result > 0 ? 1 : -1;
}
使用stream实现后发现,哎,怎么这个用例错了
41,65,14,80,20,10,55,58,24,56,28,86,96,10,3,84,4,41,13,32,42,43,83,78,82,70,15,-41
给大家5min猜想,什么原因呢?
当当当~ 就是大家发现这个坑没有!就是那个一开始的int[]数组,对!没错!int数组,int我们都知道他的最大值是-128 ~ 128,所以很明显我们的数值超过了这个数值,只能说leetcode你不讲武德,来骗,来偷袭我这个20岁的老年人。
所以我们需要改变思路,为什么要乘法呢?直接判断正负大于0就完事了,所以我给出的解题答案就是如下:
最终题解
public int arraySign(int[] nums) {
int result = 1;
int sign = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] == 0) {
return 0;
}
if (nums[i] < 0) {
sign ++;
}
}
return sign % 2 == 0 ? 1 : -1;
}