拼多多算法工程师笔试题之求解一维无序数组中三个数字乘积最大值(正负零均存在)

本文主要是介绍拼多多算法工程师笔试题之求解一维无序数组中三个数字乘积最大值(正负零均存在),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目:

给定一个包含正负数和零的一维无序数组,找到三个数字使得乘积最大

思路:

这道题目是个坑啊,我上来都没看直接当做之前一篇博文中求解矩阵中最大子数组和的问题了,采用动态规划的思想来解决,结果呢,只通过了10%左右,感觉很不可思议,于是重新读题发现不对了,人家说的是三个数字的乘积我这里动态规划的是两个数字的乘积,改成了三个数字的乘积也不对,瞬间郁闷了,不知道问题出现在了哪里,就只好自己在草稿纸上瞎写了,突然发现了端倪,题目给的样例也是一个坑,负数在这里是一个很关键的东西,因为:负负得正啊,那么接下来思路就有了,很简单,先对无序数组排序,那么所有的非负数肯定是出现在了数组的右端(这里默认是升序),在最左端的数可能是0,也可能是正数,也可能是负数,这里分几种情况考虑如下:

1.最左端是0,那么数组中不存在负数,最大值计算为:num_list[-1]*num_list[-2]*num_list[-3]

2.最左端为正数:同上

3.最左端为负数,这里可能有人会说需要考虑负数的个数,其实仔细想想是不需要,这里直接把左端的最大值记为:num_list[0]*num_list[1]*num_list[-1],是不是看出来什么端倪了,对,就是这意思,如果有超过两个负数那么这个表达式计算出来的结果必定是正数而且可能是最大值,如果只有一个负数,那么出现的结果就是:这个表达式的值必然为负数,那么最大值的计算结果就同上面两种情况了

    有了上面的分析之后,就可以得到下面几行代码的实现了,当然核心真的只有四五行,我下面加入了一点打印信息方便看结果:


#!usr/bin/env python  
#encoding:utf-8  ''''' 
__Author__:沂水寒城 
功能:求解一维无序数组中三个数字乘积最大值(正负零均存在)
''' def LargetThreeNumMutiple(n, num_list):num_list = [ int(i) for i in num_list.split(' ') ]num_list.sort()return max(num_list[0] * num_list[1] * num_list[-1], num_list[-1] * num_list[-2] * num_list[-3])if __name__ == '__main__':n = raw_input()num_list = raw_input()print '三个数字乘积最大值为:', LargetThreeNumMutiple(n, num_list)



结果如下:


4
4 3 2 1
三个数字乘积最大值为: 247
0 9 -5 7 1 3 2
三个数字乘积最大值为: 1895
0 1 6 11 4
三个数字乘积最大值为: 26410
-3 -5 -7 -11 -9 0 3 5 67 1
三个数字乘积最大值为: 663315
-34 23 45 6 7 0 0 -12 -32 -45 90 44 55 90 -100
三个数字乘积最大值为: 445500

    好了,要回去睡觉了,好困,如有感兴趣的朋友,欢迎交流哈。

这篇关于拼多多算法工程师笔试题之求解一维无序数组中三个数字乘积最大值(正负零均存在)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/904803

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

JavaScript对象转数组的三种方法实现

《JavaScript对象转数组的三种方法实现》本文介绍了在JavaScript中将对象转换为数组的三种实用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友... 目录方法1:使用Object.keys()和Array.map()方法2:使用Object.entr

java中判断json key是否存在的几种方法

《java中判断jsonkey是否存在的几种方法》在使用Java处理JSON数据时,如何判断某一个key是否存在?本文就来介绍三种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的... 目http://www.chinasem.cn录第一种方法是使用 jsONObject 的 has 方法

Python绘制TSP、VRP问题求解结果图全过程

《Python绘制TSP、VRP问题求解结果图全过程》本文介绍用Python绘制TSP和VRP问题的静态与动态结果图,静态图展示路径,动态图通过matplotlib.animation模块实现动画效果... 目录一、静态图二、动态图总结【代码】python绘制TSP、VRP问题求解结果图(包含静态图与动态图

MySQL使用EXISTS检查记录是否存在的详细过程

《MySQL使用EXISTS检查记录是否存在的详细过程》EXISTS是SQL中用于检查子查询是否返回至少一条记录的运算符,它通常用于测试是否存在满足特定条件的记录,从而在主查询中进行相应操作,本文给大... 目录基本语法示例数据库和表结构1. 使用 EXISTS 在 SELECT 语句中2. 使用 EXIS

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

基于Python实现数字限制在指定范围内的五种方式

《基于Python实现数字限制在指定范围内的五种方式》在编程中,数字范围限制是常见需求,无论是游戏开发中的角色属性值、金融计算中的利率调整,还是传感器数据处理中的异常值过滤,都需要将数字控制在合理范围... 目录引言一、基础条件判断法二、数学运算巧解法三、装饰器模式法四、自定义类封装法五、NumPy数组处理

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优