文章目录一、核心解题思路二、完整可运行代码大厂机考版力扣地址 中等238. 除了自身以外数组的乘积挺简单的一、核心解题思路前缀积数组prefixprefix[i]表示nums[0..i-1]所有元素的乘积即i位置左边所有元素的乘积后缀积数组suffixsuffix[i]表示nums[i1..n-1]所有元素的乘积即i位置右边所有元素的乘积结果数组answeranswer[i] prefix[i] * suffix[i]即左右两边乘积的组合完美避开除法时间复杂度 O (n)空间复杂度 O (n)classSolution{publicint[]productExceptSelf(int[]nums){intnnums.length;int[]prefixnewint[n];prefix[0]1;for(inti1;in;i){prefix[i]prefix[i-1]*nums[i-1];}int[]postfixnewint[n];postfix[n-1]1;for(intin-2;i0;i--){postfix[i]postfix[i1]*nums[i1];}int[]resnewint[n];for(inti0;in;i){res[i]prefix[i]*postfix[i];}returnres;}}二、完整可运行代码大厂机考版importjava.util.Scanner;publicclassMain{publicstaticint[]productExceptSelf(int[]nums){intnnums.length;// 1. 初始化前缀积数组prefix[i] nums[0] * nums[1] * ... * nums[i-1]int[]prefixnewint[n];prefix[0]1;// 第一个元素左边没有元素乘积为1for(inti1;in;i){prefix[i]prefix[i-1]*nums[i-1];}// 2. 初始化后缀积数组postfix[i] nums[i1] * nums[i2] * ... * nums[n-1]int[]postfixnewint[n];postfix[n-1]1;// 最后一个元素右边没有元素乘积为1for(intin-2;i0;i--){postfix[i]postfix[i1]*nums[i1];}// 3. 计算最终结果左右乘积相乘int[]resnewint[n];for(inti0;in;i){res[i]prefix[i]*postfix[i];}returnres;}publicstaticvoidmain(String[]args){ScannerscnewScanner(System.in);// 读取数组长度intnsc.nextInt();int[]numsnewint[n];// 读取数组元素for(inti0;in;i){nums[i]sc.nextInt();}// 输出结果for(inti:productExceptSelf(nums)){System.out.print(i );}}}