C++ 添加索引为-2的整数

C++ 添加索引为-2的整数,c++,algorithm,data-structures,C++,Algorithm,Data Structures,我参加了一次面试,面试中我被要求在第I位加上2个指数为-2的整数,即(-2)I的幂。我给出了下面的答案,但被告知这个答案是无效的和错误的。我不同意有效的评论,但可能同意不正确的评论 我添加的方法是,如果2位之和大于等于2,则进位为-1,因为相邻位具有相反的符号。如果加2位等于-1,我就把它设为1,并对相邻的位进行1的进位 有人看到代码有什么问题吗 struct Results solution ( int A[], int M, int B[], int N ) { struct Res

我参加了一次面试,面试中我被要求在第I位加上2个指数为-2的整数,即(-2)I的幂。我给出了下面的答案,但被告知这个答案是无效的和错误的。我不同意有效的评论,但可能同意不正确的评论

我添加的方法是,如果2位之和大于等于2,则进位为-1,因为相邻位具有相反的符号。如果加2位等于-1,我就把它设为1,并对相邻的位进行1的进位

有人看到代码有什么问题吗

struct Results solution ( int A[], int M, int B[], int N ) {
    struct Results result;

    int min =M;
    int max = M;

    int i=0;
    int sum;
    int carry = 0;

    if(N<M)min = N;
    if(N>M)max = N;

    result.C = (int*) malloc(sizeof(int) * max);

    for(i=0;i<min;i++){
        sum = A[i] +  B[i] + carry;
        if(sum >= 2 ){
            if(carry == 0 ) 
                carry = -1;
            else 
                carry = -carry;
            sum = sum-2;
        }
        else if(sum == -1){
            sum = 1;
            carry = 1;  
        }
        else{
            carry=0;
        }
        result.C[i] = sum;
    }

    if( M > N){
        result.L = M;
        for(i=N;i<M;i++){
            sum = A[i]+carry;
            if(sum >= 2 ){
                if(carry == 0 ) carry = -1;
                else carry = 1;
                sum = sum-2;
            }
            else if(sum == -1){
                sum = 1;
                carry = - carry;  
            }
            else{carry=0;}
            result.C[i] = sum;
        }
    }

    if( N > M){
        result.L = N;
        for(i=M;i<N;i++){
            sum = B[i]+carry;
            if(sum >= 2 ){
                if(carry == 0 ) carry = -1;
                else carry = -carry;
                sum = sum-2;
            }
            else if(sum == -1){
                sum = 1;
                carry = 1;  
            }
            else{carry=0;}
            result.C[i] = sum;
        }
    }

    return result;
}

int main(int argc, char* argv[])
{
    int A[]  = {0,1,1,0,0,1,0,1,1,1,0,1,0,1,1};
    int B[]  = {0,0,1,0,0,1,1,1,1,1,0,1};
    solution (A,15,B ,12 );
}
结构结果解决方案(int A[],int M,int B[],int N){ 结构结果; int min=M; int max=M; int i=0; 整数和; 整数进位=0; 如果(NM)最大值=N; 结果C=(int*)malloc(sizeof(int)*max); 对于(i=0;i=2){ 如果(进位==0) 进位=-1; 其他的 进位=-进位; sum=sum-2; } else if(总和==-1){ 总和=1; 进位=1; } 否则{ 进位=0; } 结果C[i]=总和; } 如果(M>N){ 结果:L=M; 对于(i=N;i=2){ 如果(进位==0)进位=-1; 否则进位=1; sum=sum-2; } else if(总和==-1){ 总和=1; 进位=-进位; } else{进位=0;} 结果C[i]=总和; } } 如果(N>M){ 结果:L=N; 对于(i=M;i=2){ 如果(进位==0)进位=-1; 否则进位=-进位; sum=sum-2; } else if(总和==-1){ 总和=1; 进位=1; } else{进位=0;} 结果C[i]=总和; } } 返回结果; } int main(int argc,char*argv[]) { int A[]={0,1,1,0,0,1,0,1,1,1,0,1,0,1,1}; int B[]={0,0,1,0,0,1,1,1,1,1,0,1}; 溶液(A,15,B,12); } 问题1 如果2位之和大于等于2,则表示使用进位-1,但在其中一种情况下,代码如下:

        if(sum >= 2 ){
            if(carry == 0 ) carry = -1;
            else carry = 1;
            sum = sum-2;
        }
这会将进位设置为1,而不是-1

您还可以认为,可以更高效地编写此代码,如下所示:

        if(sum >= 2 ){
            carry = -1;
            sum = sum-2;
        }
问题2 如果我们加上{1}和{1},会发生什么? 您将返回长度为1,结果为{0},但答案应为{0,1,1}。(1+1=-2+4) 换句话说,您可能需要返回比最大输入位更多的位。

O(1)解决方案:查表


如果您知道每个输入的位数,那么2D查找表可以快速完成。如果没有,您仍然可以使用它一次执行一堆位。

可能应该在CodeReview上询问。好的,我会这样做,我在这里没有得到帮助,所以您为您的代码辩护,说它很快就做了错误的事情。通过了提供的示例测试用例。所以我不确定我是否错过了任何边缘案例。我还说它不是有效的,因为它是一个O(N)解,N是不经过所有位就不能更快地添加位的数量。顺便说一句,这是一个在线测试,最小/最大初始化有问题。