给定数组a[N]构造数组b[N]

转自:http://blog.csdn.net/wumuzi520/article/details/7841280

给定一个数组a[N],我们希望构造数组b [N],
其中b[j]=a[0]*a[1]…a[N-1] / a[j],
在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量
(包括栈临时变量、堆空间和全局静态变量等)

解析:设b[0]=1
由b[i]=b[i-1]*a[i-1]可得
b[1] = a[0]
b[2] = a[0]a[1]

b[i] = a[0]a[1]a[2]…a[i-1]

b[n-1] = a[0]a[1]…a[n-2]
那么再通过b[0]这个变量来迭代出
1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],
迭代过程中分别乘以b[n-1], b[n-2], … , b[0]

 1 /*************************************************************************
 2     > File Name: 给定数组a[N]构造数组b[N].c
 3     > Author: Juntaran
 4     > Mail: [email protected]
 5     > Created Time: 2016年08月24日 星期三 16时47分25秒
 6  ************************************************************************/
 7
 8
 9  /*
10     给定一个数组a[N],我们希望构造数组b [N],
11     其中b[j]=a[0]*a[1]…a[N-1] / a[j],
12     在构造过程中,不允许使用除法:要求O(1)空间复杂度和O(n)的时间复杂度;
13     除遍历计数器与a[N] b[N]外,不可使用新的变量
14     (包括栈临时变量、堆空间和全局静态变量等)
15
16     解析:设b[0]=1
17     由b[i]=b[i-1]*a[i-1]可得
18     b[1] = a[0]
19     b[2] = a[0]a[1]
20     …
21     b[i] = a[0]a[1]a[2]…a[i-1]
22     …
23     b[n-1] = a[0]a[1]…a[n-2]
24     那么再通过b[0]这个变量来迭代出
25     1, a[n-1], a[n-2]a[n-1], a[n-3]a[n-2]a[n-1], … , a[1]a[2]a[3]…a[n-1],
26     迭代过程中分别乘以b[n-1], b[n-2], … , b[0]
27
28  */
29
30 #include <stdio.h>
31
32 void Translate(int a[], int b[], int n)
33 {
34     b[0] = 1;
35
36     for (int i = 1; i < n; ++i)
37     {
38         b[i] = b[i-1] * a[i-1];
39     }
40
41     for (int i = 0; i < n; ++i)
42     {
43         printf("b[%d] is %d\n", i, b[i]);
44     }
45     printf("\n");
46
47     for (int i = n-1; i >= 1; --i)
48     {
49         b[i] *= b[0];
50         b[0] *= a[i];
51     }
52
53     for (int i = 0; i < n; ++i)
54     {
55         printf("b[%d] is %d\n", i, b[i]);
56     }
57     printf("\n");
58 }
59
60 int main()
61 {
62     int a[] = {2,3,4,5};
63     int b[] = {0,0,0,0};
64     Translate(a, b, 4);
65
66     for (int i = 0; i < 4; ++i)
67     {
68         printf("%4d ", a[i]);
69     }
70     printf("\n");
71
72     for (int i = 0; i < 4; ++i)
73     {
74         printf("%4d ", b[i]);
75     }
76     printf("\n");
77 }
时间: 2024-11-29 09:09:34

给定数组a[N]构造数组b[N]的相关文章

【笔试题-腾讯】给定一个数组a[N],我们希望构造数组b[N]

腾讯2012实习生笔试题(加分题): 给定一个数组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]外,不可使用新的变量(包括栈临时变量.对空间和全局静态变量等): 请用程序实现并简单描述. 题意应该不难理解,乍一看有点儿无从下手的感觉,思考后没有突破的话就想放弃了.看到网上其他同学也给出了解法,代码很简洁,但是理解起来不是

NumPy常用函数(一)——构造数组函数及代码示例

NumPy是Python的一个科学计算的基本模块.它是一个Python库,提供了一个多维数组对象,各种衍生对象(如屏蔽数组和矩阵),以及用于数组,数学,逻辑,形状操纵,排序,选择,I/O等快速操作的各种例程 离散傅里叶变换,基本线性代数,基本统计运算,随机模拟等等. 本文主要列出构造数组常用的函数或者成为子模块 一.0-1数组 empty(shape [,dtype,order])                      返回给定形状和类型的新数组,而不初始化条目. empty_like(a

已知一个数组a[N]来构造数组b[N]的有趣算法题

给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i].在构造过程要求满足:1.不使用除法:2.O(1)空间复杂度和O(n)时间复杂度:3.除遍历a[N] b[N]使用的计数器外,不使用任何新的变量(包括栈临时变量.对空间和全局静态变量等): /**********************************************/ /* 给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[

构造数组的MaxTree

[说明]: 本文是左程云老师所著的<程序员面试代码指南>第一章中“构造数组的MaxTree”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解析说明,具体的问题解析请参考原书. 感谢左程云老师的支持. [题目]: 定义二叉树节点如下: class Node { public: Node(int data) { value = data; left = NULL; right = NULL; } public: int value; Node *left; No

算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序

接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public int value; public Node left; public Node right; public Node(int data){ this.value=data; } } 一个数组的MaxTree定义如下: ◆ 数组必须没有重复元素 ◆ MaxTree是一颗二叉树,数组的每一个值对应一

9.11排序与查找(三)——给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,找出数组中的某个元素

/** * 功能:给定一个排序后的数组,包含n个整数,但这个数组已被旋转过多次,次数不详.找出数组中的某个元素. * 可以假定数组元素原先是按从小到大的顺序排列的. */ /** * 思路:数组被旋转过了,则寻找拐点. * @param a * @param left * @param right * @param x:要搜索的元素 * @return */ public static int search(int[] a,int left,int right,int x){ int mid=(

《程序员面试指南》第一章 栈和队列 构造数组的MaxTree

题目 给出一个无重复元素的数组,构造此数组的MaxTree, java代码 /** * @Description: 构造数组的MaxTree * @Author: lizhouwei * @CreateDate: 2018/4/5 22:16 * @Modify by: * @ModifyDate: */ public class Chapter1_8 { public Node getMaxTree(int[] arr) { if (arr == null) { return null; }

位运算-异或运算-只出现一次的数字-给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素

给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次.找出那个只出现了一次的元素. 示例: 输入: [2,2,1] 输出: 1 输入: [4,1,2,1,2] 输出: 4 GO: func singleNumber(nums []int) int { var num int for i := 0; i < len(nums); i++ { num = num ^ nums[i]; } return num; } PHP: class Solution { /** * @par

完全二叉树 数组存储 层次构造

对于完全二叉树,如果将其中的元素按层次遍历顺序存放入一个一维数组中:设数组大小为n(节点数为n),节点标号(key)为数组下标i,即0,1,2,3,4,,,那么:1.完全二叉树的高度为: ceil(log2(n+1))2.i = 0: 根节点,root,无父节点. i >= 1: 父节点为 floor((i-1)/2);3.若2*i<n-1: 节点i的左子女为 2*i + 1 若2*i<n-2: 节点i的右子女为 2*i + 24.若节点编号 i 为奇数,i != 1, 它处于右兄弟位置