首页 > 试题广场 >

计算数组的最大乘积

[编程题]计算数组的最大乘积
  • 热度指数:217 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给定一个整型数组,移除数组的某个元素使其剩下的元素乘积最大,如果数组出现相同的元素 ,请输出第一次出现的元素

输入描述:
一个整形数组,每个字符串直接用逗号(,)分割


输出描述:
请输出要被移除的数组索引,以0开始
示例1

输入

5,8,6,9,2,2,7

输出

4

说明

移除2得到的乘积最大,第一个2对应的数组索引为4

备注:
请考虑一下数组中有负数的情况

对于如此变态的数据范围,我也不得不动用同样变态的 BigDecimal

public class Main {
  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String[] nums = scanner.next().split(",");
    int n = nums.length;
    // dp[i] -> 除 nums[i] 以外的其余所有元素的乘积
    BigDecimal[] dp = new BigDecimal[n];
    dp[0] = BigDecimal.valueOf(1);
    for (int i = 1; i < n; i++) {
      dp[i] = dp[i - 1].multiply(BigDecimal.valueOf(Integer.parseInt(nums[i - 1])));
    }
    BigDecimal temp = BigDecimal.valueOf(1);
    for (int i = n - 1; i >= 0; i--) {
      dp[i] = dp[i].multiply(temp);
      temp = temp.multiply(BigDecimal.valueOf(Integer.parseInt(nums[i])));
    }
    BigDecimal max = dp[0];
    int idx = 0;
    for (int i = 1; i < n; i++) {
      if (dp[i].compareTo(max) > 0) {
        max = dp[i];
        idx = i;
      }
    }
    System.out.println(idx);
  }
}
发表于 2022-03-30 20:11:06 回复(0)
分三种情况讨论

import java.util.*; 
import java.math.*;
public class Main {
//移调数组一个元素使得数组乘积最大
        private static int maxRemove(int[] nums) {
            BigInteger mlt = new BigInteger("1");
            for (int n: nums) {
                if (n == 0) {
                    continue;
                }
               mlt = mlt.multiply(BigInteger.valueOf(n));
            }
            int res = -1;
            BigInteger max = BigInteger.valueOf((Integer.MIN_VALUE));
            for (int i = 0; i < nums.length; i++) {
                BigInteger cur = mlt.divide(BigInteger.valueOf(nums[i]));
                if (cur.compareTo(max) > 0) {
                    res = i;
                    max = cur;
                }
            }
            return res;
        }

        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            String s = sc.nextLine();
            String[] ss = s.split(",");
            int n = ss.length;
            int[] nums = new int[n];
            boolean hasZero = false;
            int cntZero = 0;
            for (int i = 0; i < n; i++) {
                nums[i] = Integer.parseInt(ss[i]);
                if (nums[i] == 0) {
                    hasZero = true;
                    cntZero++;
                }
            }
            sc.close();
            if (cntZero > 1) {
                System.out.println(0); //随便移除谁都是0
            } else if (cntZero == 1) {
                BigInteger mlt = new BigInteger("1");
                int zeroIdx = -1;
                for (int i = 0; i < n; i++) {
                    if (nums[i] != 0) {
                        mlt = mlt.multiply(BigInteger.valueOf(n));
                    } else {
                        zeroIdx = i;
                    }
                }
                System.out.println(mlt.compareTo(BigInteger.valueOf(0)) > 0 ? zeroIdx : 0);
            } else {
                System.out.println(maxRemove(nums));
            }
            // int[] nums = {4,3,5,-7,-21,9,-1,-5,6,0};
        }
    }

发表于 2022-03-09 15:45:02 回复(0)
 
public static String removeMin(List<Integer> list) {
        int min = list.get(0);
        HashSet<Integer> set = new HashSet<>();
        int num=0,index=0;
        for (int i = 0; i < list.size(); i++) {
            if (!set.add(list.get(i))) {
                num=list.get(i);
            }
            if (list.get(i) - min < 0) {
                min = list.get(i);
                index=i;
            }
        }
        return "移除的元素为"+min+",下标是"+index+",相同元素第一次出现的是"+num;
    }

发表于 2021-03-01 00:43:23 回复(0)
    public static Integer removeElement(List<Integer> list) {
        if (CollectionUtils.isNotEmpty(list)) {
            int index = 0;
            int min = list.get(0);
            for (int i = 1; i < list.size(); i++) {
                if (list.get(i) - min < 0) {
                    min = list.get(i);
                    index = i;
                }
            }
            list.remove(index);
            return index;
        }
        return null;
    }

发表于 2021-02-02 10:45:26 回复(0)