[Nowcoder] 最大乘积(拼多多笔试题)

给定一个无序数组,包含正数、负数和0,要求从中找出3个数的乘积,使得乘积最大,要求时间复杂度:O(n),空间复杂度:O(1)

输入描述:
无序整数数组A[n]
输出描述:
满足条件的最大乘积
输入例子1:
3 4 1 2
输出例子1:
24

求三个数字的最大乘积。

1. 数组全部是正数,最大三个数的乘积

2. 数组全部是负数,最大三个数的乘积

3. 数组有正有负,最大的一个数和最小的两个数的乘积

所以一共需要计算五个值:数组中最大的三个值和最小的两个值

比较最大三个数的乘积和最大一个数与最小两个数的乘积。

因为题目要求时间复杂度为O(1),故不能先排序。

所以需要在遍历的同时找出这五个数。

参考代码如下:

#include <iostream>
#include <vector>
#include <climits>
#include <cmath>
using namespace std;

int main()
{
    int n;
    while (cin >> n)
    {
        vector<long long> nums(n, 0);
        // 读取输入
        for (int i = 0; i < n; ++i)
        {
            cin >> nums[i];
        }
        // 定义需要计算的数值
        long long max1 = 0, max2 = 0, max3 = 0, min1 = 0, min2 = 0, res1 = 0, res2 = 0;
        // 比较数组前三个数找出其中的大小关系来确定五个数
        max1 = max(nums[0], nums[1]);
        max2 = min(nums[0], nums[1]);
        if (nums[2] > max1)
        {
            max3 = max2;
            max2 = max1;
            max1 = nums[2];
        }
        else if (nums[2] > max2)
        {
            max3 = max2;
            max2 = nums[2];
        }
        else
            max3 = nums[2];
        min1 = max3;
        min2 = max2;
        // 根据前面确定的关系遍历数组。更新五个目标值
        for (int i = 3; i < n; ++i)
        {
            if (nums[i] < min1)
            {
                min2 = min1;
                min1 = nums[i];
            }
            else if (nums[i] < min2)
            {
                min2 = nums[i];
            }
            if (nums[i] > max1)
            {
                max3 = max2;
                max2 = max1;
                max1 = nums[i];
            }
            else if (nums[i] > max2)
            {
                max3 = max2;
                max2 = nums[i];
            }
            else if (nums[i] > max3)
                max3 = nums[i];
        }
        // 计算三个最大数的乘积
        res1 = max1 * max2 * max3;
        // 计算一个最大数和两个最小数的乘积
        res2 = max1 * min1 * min2;
        // 输出结果
        cout << max(res1, res2) << endl;
        return 0;
    }
}    

原文地址:https://www.cnblogs.com/immjc/p/9420202.html

时间: 2024-11-08 20:55:18

[Nowcoder] 最大乘积(拼多多笔试题)的相关文章

[Nowcoder] 大整数相乘(拼多多笔试题)

有两个用字符串表示的非常大的大整数,算出他们的乘积,也是用字符串表示.不能用系统自带的大整数类型. 输入描述: 空格分隔的两个字符串,代表输入的两个大整数 输出描述: 输入的乘积,用字符串表示 输入例子1: 72106547548473106236 982161082972751393 输出例子1: 70820244829634538040848656466105986748 大数乘法问题 简单来说就是把A[i]*B[j]累加放到临时数组的C[i+j]位置. 然后对数组C执行进位加法即可. 剩下

java笔试题(1)

转载自:http://blog.csdn.net/fmh2011/article/details/19690999 某互联网公司的java基础笔试题 该公司的不少题来自于java面试宝典 1.char型变量中能不能存贮一个中文汉字?为什么? char型变量是用来存储Unicode编码的字符的,unicode编码字符集中包含了汉字,所以,char型变量中当然可以存储汉字啦.不过,如果某个特殊的汉字没有被包含在unicode编码字符集中,那么,这个char型变量中就不能存储这个特殊汉字.补充说明:u

几道js的笔试题

一.今天在群里看见有同学发了几道关于js的笔试题,拿来研究一下,虽然自己看过了高级程序设计,也看了javascript语言精粹,自以为对js还是有一些理解的,但是真正遇到问题的时候,发现并不能融会贯通,掌握的不扎实.借此机会来回顾一下,共同学习~ 二.几道小题(写出以下几道题的弹出框的内容) (1) 1 if(!("a" in window)){ 2 var a=1; 3 } 4 alert(a); 解析:正常的思路:首先需要了解函数声明提升的概念,在执行代码之前,会先读取函数或者变量

C/C++ 笔试题

/////转自http://blog.csdn.net/suxinpingtao51/article/details/8015147#userconsent# 微软亚洲技术中心的面试题!!! 1.进程和线程的差别. 线程是指进程内的一个执行单元,也是进程内的可调度实体.与进程的区别:(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行(3)拥有资源:进程是拥有资源的独立单位,线程不拥有系统资源,但可以访问

2018春招-今日头条笔试题-第三题(python)

题目描述:2018春招-今日头条笔试题5题(后附大佬答案-c++版) 解题思路: 本题的做法最重要的应该是如何拼出'1234567890',对于输入表达试获得对应的结果利用python内置函数eval()即可以实现.利用5个字符串来表达'1234567890',如下(为了好看,里面加了tab空格符) '66666 ....6 66666 66666 6...6 66666 66666 66666 66666 66666''6...6 ....6 ....6 ....6 6...6 6.... 6

看懂的拼多多店群双十一冲刺一周三万+

店群管家大讲堂-我们先说说为什么要做拼多多店群,做过淘宝店群的都知道,在红利期到来的时候,在淘宝上面做店群的都狠狠赚了一笔,用的就是赚佣金赚差价.随着淘宝规则逐渐的完善,限制越多相对也没前两年好做了.而拼多多店群现在正好是红利期,因此要抓住机会.下面先了解一下拼多多的发展史:拼多多是一五年的电商平台,当时是跟拼好货合并,一六年开始火,一七年算是彻头彻尾火了一年,从去年年底已经有好多大佬,开始涉足拼多多店群这一块的玩法,其实现在去看拼多多,偶尔会看到他家上的商品数有几千个这样的,还有销量有几万的,

拼多多活动保证金,要了解的7个问题

什么是拼多多活动保证金?多多学堂手把手教你拼多多开店技巧:所有想要参加拼多多活动的商户需要缴纳一定的保证金.拼多多商家在参加秒杀活动或拼单返现等活动时,都是需要缴纳一定的活动保证金的.这个活动保证金在活动结束后是可以进行提现的,所以各位商家无需太过担心.这里还有7个关于拼多多活动保证金的问题,各位商家同样要清楚的.Q:为什么我无法充值营销保证金?因为当前充值是跟业务进行绑定的,不进行活动就无法充值营销保证金,只有在创建限时免单和拼单返现营销计划的时候,才可提现余额中充值到营销保证金账户.Q:营销

拼多多 产品体验

一.产品是什么?(客观描述:产品是什么.产品满足的需求点 产品是啥: 拼多多是一款专注于拼团的社交购物APP 产品满足的需求点: 产品通过对接供应链的方式,以最低的价格吸引对于价格较为敏感的用户群体,同时,拼团降价的方式也满足了人们对于“占便宜”的心理需求,吸引了更多用户,加入到社交购物的行列中来. 二. 目标用户与典型使用场景(目标用户在使用该产品的典型场景,不少于3例) 案例1: 目标用户:19~25岁的在校大学生,他们没有经济来源,乐于网上购物,拼多多可以满足他们对于部分生活小物件的需求.

面试完还呗、拼多多、蚂蚁金服、趣头条、京东到家之后,我知道了这些

最近一个朋友,在谋求架构师岗位的工作,经历了魔都的一批互联网公司的洗礼,让他把面试经历整理了一下,给大家一些经验吧,希望各位后面去这些公司面试的时候,能有些心理准备. 还呗 地点:2号线金科路地铁站(长泰广场A座) 环境:环境还不错,装修偏简约风,工位是互联网公司那种排排坐. 投递方式:拉勾网 面试流程:开始是做自我介绍,然后聊项目经历. 整体评价:说实话我怀疑还呗是打着招聘的幌子,只是约面试而已,不是实际想招人.因为面试基本上没有问太多问题,然后说后面约二面,但是后面打电话联系说招聘冻结,所以