漫画:去掉一个数,如何让剩余的数乘积最大?
————— 第二天 —————
举个例子,给定如下数组:
要删除哪个元素,才能使得剩余元素的乘积最大呢?
显然应该删除元素2:
剩余元素的乘积 = 5 X 8 X 6 X9 X 7 = 15120
————————————
小灰把面试题目告诉给了大黄......
数组中哪个负数的绝对值最小呢?显然是元素-2:
我们删去元素-2,原本数组中的三个负数变成了两个,负负得正,而且保证了剩余元素的乘积最大。
数组中哪个非负元素最小呢?显然是元素3:
我们删去元素3,数组中剩余元素的乘积仍然是正数,而且绝对值最大。
数组中哪个负数元素的绝对值最大呢?显然是元素-9:
既然剩余元素的乘积无论如何都是负的,我们就索性删去绝对值最大的元素-9,使得剩余元素乘积的绝对值尽可能小。
总结一下,需要考虑的数组元素情况共有三种:
情况A:奇数个负数
情况B:偶数(包括0)个负数
子情况:没有非负数
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—————
《漫画算法》
本书是全彩印制,书中的每一章、每一节、每一句话、每一幅图、每一行代码,都经过了小灰和编辑们的精心打磨,力求用最为直白的方式把知识讲明白、讲透彻。
对于渴望学习算法的小伙伴,无论你是正在学习计算机专业的学生,还是已经进入职场的新人,亦或是拥有多年工作经验却不擅长算法的老手,这本《漫画算法》都能帮助你告别对算法的恐惧,认识算法、掌握算法。
扫码购买
漫画:去掉一个数,如何让剩余的数乘积最大?相关推荐
- json格式的数据集中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序
json文件中每一条数据5个选项随机去掉一个错误选项,剩余选项重新排序 json格式的数据集中含有5个选项,随机去掉一个错误选项,剩余选项重新排序. 数据集示例: [{"context&qu ...
- Redis 笔记(02)— keys 键相关命令(查询数据库key数量、判断key是否存在、指定key过期时间、查看key类型、查看key剩余秒数、选择数据库、删除key、删除数据库)
1. keys 键相关命令 命令 说明 dbsize 返回当前数据路的key数量 exists key 测试指定key是否存在 expire key seconds 为key指定过期时间 type k ...
- C语言判断一个数是否是回文数
C语言判断一个数是否是回文数 #include <stdio.h> int main(){int num, s, y = 0;printf("请输入一个数字: ");s ...
- Linux上如何查看物理CPU个数,核数,线程数
首先,看看什么是超线程概念 超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的 ...
- C++判断一个数是否为回文数palindrome的算法(附完整源码)
C++判断一个数是否为回文数palindrome的算法 C++判断一个数是否为回文数palindrome的算法完整源码(定义,实现,main函数测试) C++判断一个数是否为回文数palindrome ...
- Java黑皮书课后题第6章:**6.3(回文整数)使用下面的方法头编写两个方法:……使用reverse方法实现isPalindrome。如果一个数字的逆序数和它自身相等,这个数就称为回文数。
6.3(回文整数)使用下面的方法头编写两个方法:--使用reverse方法实现isPalindrome.如果一个数字的逆序数和它自身相等,这个数就称为回文数. 题目 题目概述 破题:假设没有提示语句( ...
- java判断五位数回文数_【视频+图文】Java经典基础练习题(五):键盘输入一个五位数,判断这个数是否为回文数...
能解决题目的代码并不是一次就可以写好的 我们需要根据我们的思路写出后通过debug模式找到不足再进行更改 多次测试后才可得到能解决题目的代码! 通过学习,练习[Java基础经典练习题],让我们一起来培 ...
- 判断一个数是否是回文数(Java)
分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请轻击http://www.captainbed.net package live.every.day.Pro ...
- python判断一个数是否为回文数
判断一个数是否为回文数(正向读和反向读结果一样) num = raw_input('请输入要判断是否为回文数的数:') if (num[::-1] == num[:]): print '% ...
最新文章
- 电子计算机说明文作文,电脑事物说明文
- Seven Segment Display
- 12_信息熵,信息熵公式,信息增益,决策树、常见决策树使用的算法、决策树的流程、决策树API、决策树案例、随机森林、随机森林的构建过程、随机森林API、随机森林的优缺点、随机森林案例
- 在java中的ascii_在Java中绘制ASCII艺术
- 润乾报表分组求和_实现报表数据预先计算
- c++模板---3(类模板碰到继承问题,类模板类外实现,类模板与友元函数)
- 地磅称重软件源码_电脑设备器件+塔吊主吊臂+撇渣管、丝杆+地磅称重传感器+极柱触头盒弯板+批式循环谷物干燥机+升降机标准节...
- CentOS7 源码编译安装Python3 shell脚本
- 【动态规划1】动态规划的引入(今天刷洛谷了嘛)
- 读《高性能网站建设指南》有感
- sqlite数据库基础学习
- 航测空三用的软件_航测数据处理答疑55问!涉及CC、Pix4D、Photoscan、EPS等常见软件问题...
- 使用ESAPI 解决veracode 漏洞
- win10升级补丁_官方win10教育版怎么样
- php网站挂马,网页挂马详细教程
- infer的用法_使用 Infer 进行代码扫描
- 码绘与手绘——表达动态
- 基于SSM的家政服务管理系统
- 小白电脑选购与组装之配置篇
- ps如何裁剪掉图片中间不需要的部分
热门文章
- 转载-配置tomcat让shtml嵌套文件显示
- jQuery函数$(window).load事件
- 看看什么样的人适合网上开店( 转载)
- HDU.1004 Let the Balloon Rise
- 记录——《C Primer Plus (第五版)》第十章编程练习第十一题
- 2. 字符串、向量和数组
- 中国水泥板市场趋势报告、技术动态创新及市场预测
- mysql foundrows 并发_MySQL 中的 FOUND_ROWS() 函数
- java形状函数_java基础:10.4 Java FX之形状
- 区块链只能算半个“信任机器”,隐私计算才是真正的信任机器?