腾讯实习生的一道笔试题

来源:互联网 发布:seo自学 编辑:程序博客网 时间:2024/04/30 06:04

Q:

两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i]。

要求: 
1.不准用除法运算


A:

要求一:线性时间复杂度,空间复杂度不限。

很简单,两个辅助数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Func(int *a,int *b,int n)
{
    int *left=new int[n];
    int *right=new int[n];
 
    left[0]=1;
    right[n-1]=1;
 
    for(int i=1;i<n;++i)
        left[i]=left[i-1]*a[i-1];
    for(int i=n-2;i>=0;--i)
        right[i]=right[i+1]*a[i+1];
 
    for(int i=0;i<n;++i)
        b[i]=left[i]*right[i];
}

 

要求二:线性复杂度,空间复杂度只允许用一个辅助数组和一个局部变量。

复杂一些。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Func(int *a,int *b,int n)
{
    int *arr=new int[n];
    arr[0]=a[0];
    for(int i=1;i<n-1;++i)
        arr[i]=arr[i-1]*a[i];
    arr[n-1]=a[n-1];
 
    for(int i=n-1;i>=0;--i)
    {
        int temp=a[i];
        if(i==n-1)
            b[i]=arr[i-1];
        if(i<n-1 && i>0)
        {
            b[i]=arr[i-1]*arr[i+1];
            arr[i]=temp*arr[i+1];
        }
        if(i==0)
            b[i]=arr[i+1];
    }
}

 

 

要求三:线性时间复杂度,除了循环计数,不能再用其他变量。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void Func(int *a,int *b,int n)
{
    b[0]=1;
    //b[1]到b[n-1]的左半边构造完成
    for(int i=1;i<n;++i)
    {
        b[0]=b[0]*a[i-1];
        b[i]=b[0];
    }
    b[0]=1;
    //b[1]到b[n-1]的右半边构造完成
    for(int i=n-2;i>0;--i)
    {
        b[0]=b[0]*a[i+1];
        b[i]=b[i]*b[0];
    }
    b[0]=b[0]*a[1];
}
0 0
原创粉丝点击