Python程序员面试算法宝典---解题总结: 第4章 数组 4.19 如何按要求构造新的数组

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第4章 数组 4.19 如何按要求构造新的数组

题目:
给定一个数组a[N],希望构造一个新的数组b[N],其中
b[i]=a[0]*a[1]*....a[N-1]/a[i]。
在构造数组的过程中,有如下几点要求:
(a) 不允许使用除法
(b) 要求O(1)空间复杂度和O(N)时间复杂度;
(c) 除遍历计数器与a[N]、b[N]外,不可以使用新的变量(
包括栈临时变量、堆空间和全局静态变量等);
(d) 请使用程序实现并简单描述

分析:

关键:
1 书上解法
还是用累乘法
令b[i]=b[i-1]*a[i-1]=a[0]*a[1]*...*a[i-1]
只要令b[i]再乘以a[i+1]*...*a[N-1]
然后令b[0]=a[N-1]
令b[i] *= b[0],
  b[0] *= a[i]
这样,就可以得到真正的b[i]

2 我没想到
是因为忘记用累乘法,正向遍历数组和反向遍历数组


参考:
Python程序员面试算法宝典
'''

def constructArray(array, newArray):
    if not array:
        return
    if not newArray:
        return
    newArray[0] = 1
    size = len(array)
    # 正向遍历数组
    for i in range(1, size):
        newArray[i] = newArray[i - 1] * array[i - 1]
    newArray[0] = array[size - 1]
    for i in range(size - 2, 0, -1):
        newArray[i] *= newArray[0]
        newArray[0] *= array[i]
    return newArray

def process():
    array = list(range(1, 11))
    size = len(array)
    newArray = [None for i in range(size)]
    result = constructArray(array, newArray)
    for value in result:
        print value


if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)