1. 程式人生 > >2018 拼多多 校招真題 最大乘積

2018 拼多多 校招真題 最大乘積

arr mod span text 題目 boa int() 正數 校招

最大乘積 時間限制:1秒 空間限制:32768K 熱度指數:8197 校招時部分企業筆試將禁止編程題跳出頁面,為提前適應,練習時請使用在線自測,而非本地IDE。

題目描述

給定一個無序數組,包含正數、負數和0,要求從中找出3個數的乘積,使得乘積最大,要求時間復雜度:O(n),空間復雜度:O(1)

輸入描述:

無序整數數組A[n]

輸出描述:

滿足條件的最大乘積
示例1

輸入


3 
4 1 2

輸出

8


思路分析:

看到這個題目,下意識想到用Arrays.sort()排一下序,

因為輸入的整數可以是負數,所以只需要用Math.max()判斷一下,

最大的三個數的乘積 與 最小兩個數與最大那個數的乘積 哪個數大,輸出哪個就行啦,


例如:5,3,2,-8,-9;
5*3*2=30 < 5*(-8)*(-9)=360

but Arrays.sort()的思路是歸並排序,時間復雜度是O(n*log(n)),不符合題目要求
所以,額,,,我就用了最最笨的方法哈哈:

我用三個變量存前三大的整數,用兩個變量存最小的兩個數;

一邊接收輸入的值,一邊判斷,時間復雜度為O(n),空間復雜度為O(1);

最後輸出 最大的那三個數的乘積大與最小的那兩個數與最大的數的乘積中較大的數就ok啦。

Java 代碼如下:
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner sca 
= new Scanner(System.in); int n = 0; int m = sca.nextInt(); int max=Integer.MIN_VALUE,max1=Integer.MIN_VALUE,max2=Integer.MIN_VALUE,min=Integer.MAX_VALUE,min1 = Integer.MAX_VALUE; for(int i = 0;i<m;i++){ n = sca.nextInt(); if(max>n){ max2
= Math.max(Math.min(max1,n),max2); max1 = Math.max(max1,n); }else{ max2 = max1; max1 = max; max = n; } if(min<n) min1 = Math.min(min1,n); else{ min1 = min; min = n; } } long a = (long)max*max1*max2; long b = (long)max*min*min1; System.out.println(Math.max(a,b)); } }

 

2018 拼多多 校招真題 最大乘積