1.9 面试经典150题 除自身以外数组的乘积

博客围绕除自身以外数组的乘积问题展开,给定整数数组,需返回一个数组,其中元素等于原数组中除该元素之外其余各元素的乘积。题目要求不使用除法,且在特定时间复杂度内完成,数据保证元素前后缀乘积在32位整数范围内。

除自身以外数组的乘积

给你一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请 不要使用除法,且在 O(n) 时间复杂度内完成此题。

class Solution:
    def productExceptSelf(self, nums: List[int]) -> List[int]:
        ans = []
        if not nums: return []
        length = len(nums)
        if length == 1: return [0]
        L = [0] * length
        R = [0] * length
        L[0] = R[-1] = 1
        for i in range(1, length):
            L[i] = L[i - 1] * nums[i - 1]
            R[length - i - 1] = R[length - i] * nums[length - i]
        
        for i in range(length):
            ans.append(L[i] * R[i])
  
        return ans

### 有序数组中插入元素的算法实现 在有序数组中插入一个新元素,使得数组仍然保持有序状态是一个常见的编程问。以下是关于此操作的具体说明以及其实现方法。 #### Java 实现方式 初始化已排序的数组后,定义变量用于存储待插入的整数值[^1]。接着通过遍历整个数组寻找适合插入的位置,在这个过程中如果发现当前索引处的值大于等于目标值,则可以在此位置停止查找并将新的整数放置于此位置之前或之后(取决于升序还是降序)。假如在整个迭代过程结束都没有遇到这样的情况,则意味着应该把新增加进去的那个数字放到列表末端作为最后一个项目加入其中。最终创建一个新的更大容量大小的新数组用来保存调整后的序列,并打印出来确认效果。 ```java public class InsertIntoSortedArray { public static void main(String[] args) { int[] sortedArray = {1, 3, 5, 7, 9}; int numberToInsert = 4; // 调用 insert 方法完成插入动作 int[] newArray = insert(sortedArray, numberToInsert); System.out.println("New Array:"); for (int num : newArray){ System.out.print(num + " "); } } private static int[] insert(int[] array, int value){ int n = array.length; // 创建一个更大的数组容纳原有数据加上额外的一个空间给定要插进来的那个数值 int[] result = new int[n+1]; boolean insertedFlag=false; for(int i=0;i<n || !insertedFlag ;i++){ if(!insertedFlag && ((i==n)||value<array[i])){ result[i]=value; insertedFlag=true; }else{ result[(insertedFlag)?i:i-1 ]=array[i-insertedFlag?0:1 ]; } } return result ; } } ``` #### C语言实现方式 另一种解决办法是在C语言环境下采用冒泡排序技术来达到目的。首先构建起始长度固定的数组结构体实例化对象,预留足够的内存单元供后续扩展之需当有需求添加更多成员进来的时候不至于溢出边界条件引发错误异常状况发生。然后利用标准库函数或者自定义逻辑填充初始九项有效成分完毕后再单独追加一项代表即将被安排进入队列里的候选项。接下来执行一系列比较交换操作直至满足既定秩序为止最后呈现整体成果图景让用户直观感受变化前后区别所在之处[^2]。 ```c #include<stdio.h> void bubbleSort(int arr[], int size); void displayArray(const char* message, const int arr[], int size); // 主程序入口点 int main(){ int originalSize = 9; int extendedSize = 10; int dataArray[extendedSize]; printf("Enter %d integers in ascending order:\n",originalSize ); for(int index=0;index<originalSize; ++index ){ scanf("%d",&dataArray[index]); } printf("\nEnter the integer to be inserted into above sequence:\n"); scanf("%d",&dataArray[originalSize]); bubbleSort(dataArray , extendedSize ); displayArray("After insertion and sorting:", dataArray, extendedSize); return 0; } // 冒泡排序功能子例程定义部分 void bubbleSort(int arr[], int size){ bool swapped ; do{ swapped =false; for(int passIndex=size-1;passIndex>0;--passIndex){ if(arr[passIndex]<arr[passIndex -1]){ int tempValue=arr[passIndex]; arr[passIndex]=arr[passIndex -1]; arr[passIndex -1]=tempValue; swapped=true; } } }while(swapped); } // 展示数组内容辅助工具类声明区域 void displayArray(const char* message,const int arr[], int size){ printf("%s\n",message); for(int position=0;position<size;++position){ printf("%d ",arr[position]); } putchar(&#39;\n&#39;); } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值