前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >漫画:去掉一个数,如何让剩余的数乘积最大?

漫画:去掉一个数,如何让剩余的数乘积最大?

作者头像
小灰
发布2020-04-22 16:02:23
6300
发布2020-04-22 16:02:23
举报
文章被收录于专栏:程序员小灰程序员小灰

————— 第二天 —————

举个例子,给定如下数组:

要删除哪个元素,才能使得剩余元素的乘积最大呢?

显然应该删除元素2:

剩余元素的乘积 = 5 X 8 X 6 X9 X 7 = 15120

————————————

小灰把面试题目告诉给了大黄......

数组中哪个负数的绝对值最小呢?显然是元素-2:

我们删去元素-2,原本数组中的三个负数变成了两个,负负得正,而且保证了剩余元素的乘积最大。

数组中哪个非负元素最小呢?显然是元素3:

我们删去元素3,数组中剩余元素的乘积仍然是正数,而且绝对值最大。

数组中哪个负数元素的绝对值最大呢?显然是元素-9:

既然剩余元素的乘积无论如何都是负的,我们就索性删去绝对值最大的元素-9,使得剩余元素乘积的绝对值尽可能小。

总结一下,需要考虑的数组元素情况共有三种:

  • 情况A:奇数个负数
  • 情况B:偶数(包括0)个负数
    • 子情况:没有非负数
代码语言:javascript
复制
public static int findRemovedIndex(int[] array){    // 1.统计负元素的个数    int negativeCount = 0;    for(int i=0; i<array.length; i++){        if(array[i] < 0){            negativeCount ++;        }    }    // 2.根据不同情况,选择要删除的元素    int tempIndex = 0;    if((negativeCount&1)==1){        //情况A:负数个数是奇数        for(int i=1; i<array.length; i++){            if(array[i] < 0){                if(array[tempIndex]>=0 || array[i]>array[tempIndex]){                    tempIndex = i;                }            }        }        return tempIndex;    } else {        //情况B:负数个数是偶数        if(array.length == negativeCount){            //子情况:所有元素都是负数            for(int i=1; i<array.length; i++){                if(array[i] < array[tempIndex]){                    tempIndex = i;                }            }            return tempIndex;        };        for(int i=1; i<array.length; i++){            if(array[i] >= 0){                if(array[tempIndex]<0 || array[i]<array[tempIndex]){                    tempIndex = i;                }            }        }        return tempIndex;    }}

public static void main(String[] args) {    int[] array1 = {-4,3,-5,-7,-21,9,-1,5,6};    int index = findRemovedIndex(array1);    System.out.println("删除元素下标:"+ array1[index]);
    int[] array2 = {4,3,5,-7,-21,9,-1,-5,6,0};    index = findRemovedIndex(array2);    System.out.println("删除元素下标:"+ array2[index]);
    int[] array3 = {-4,-3,-5,-7,-21,-9,-1,-8};    index = findRemovedIndex(array3);    System.out.println("删除元素下标:"+ array3[index]);}

这段代码实现包含两步:

1.遍历数组,统计数组当中负数元素的个数。

2.根据负数元素的奇偶性,选择不同的处理方式。

上面这个数组是典型的情况B,即负数个数是偶数的情况。那么要想让剩余元素乘积最大,我们只要删除最小的非负元素,也就是删除元素0即可:

—————END—————

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小灰 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档