C 给定一个单位数的正整数数组,将其转换为整数,乘以2,返回一个新的乘积数组,数组中的每个数字

C 给定一个单位数的正整数数组,将其转换为整数,乘以2,返回一个新的乘积数组,数组中的每个数字,c,arrays,C,Arrays,例如: [1,2,3] -> [2,4,6] [9,1] -> [1,8,2] [6,7,5] -> [1,3,5,0] 我在昨天的第一次技术面试中遇到了这个问题(用C语言回答,因为这是我最好的语言,所以C语言的答案会更有帮助),但完全没有回答:( 我是这么想的: 从阵列的末尾开始,并保持向左移动 在每一个arr[i]处,乘以2,看看是否有两个数字(如果arr[i]/10!=0),如果有最左边的数字,只要a[i-1]!=NULL,就把它带到arr[i-1] 我只是想不出如何在

例如:

[1,2,3] -> [2,4,6]
[9,1] -> [1,8,2]
[6,7,5] -> [1,3,5,0]
我在昨天的第一次技术面试中遇到了这个问题(用C语言回答,因为这是我最好的语言,所以C语言的答案会更有帮助),但完全没有回答:( 我是这么想的:

从阵列的末尾开始,并保持向左移动 在每一个
arr[i]
处,乘以2,看看是否有两个数字(如果
arr[i]/10!=0
),如果有最左边的数字,只要
a[i-1]!=NULL
,就把它带到
arr[i-1]

我只是想不出如何在C中真正做到这一点。我有这样的想法:

int* multTwo(int* arr, int len) {
    int *newarr;   // I know i have to malloc, but not sure what size because
                   // wouldnt the size depend on the new number's size?
    int temp, i;
    for (i=len-1; i>=0; i--) {
       temp = arr[i]*2;
       newarr[i] = temp%2;
       if(temp/10 != 0) 
          newarr[i-1] = temp/2;
    }
    return newarr;
}

但是我的代码中有很多错误。有没有更好的方法,或者我的思路是否正确?

我能在短时间内思考的最好方法,比如面试

#include <stdio.h>
#include <stdlib.h>

void invert (int *head, int *tail)
{
    int temp;

    if (head < tail)
    {
        temp = *head;
        *head = *tail;
        *tail = temp;

        invert(++head, --tail);
    }
}

int* multTwo(int* arr, size_t len)
{
    int value = 0;
    int n_digits =0 ;

    // CONVERT THE ARRAY TO NUMBER
    while(len--)
    {
        value += *arr;

        value *=10;

        arr++;
    }

    value /= 10;

    // DOUBLE THE NUMBER
    value *= 2;

    // CONVERT IT TO BUFFER
    int *digits = malloc(sizeof(*digits));

    while ((value>0) && (digits != NULL))
    {
        digits[n_digits++] = value%10;

        value /= 10;

        digits = realloc(  digits, sizeof(*digits) * (n_digits+1) );
    }

    if (digits != NULL)
    {
        invert(digits, &digits[n_digits-1]);

        printf("[ ");

        for (int i=0; i<n_digits; i++)
            printf("%d, ", digits[i]);

        printf("]\n");
    }

    return digits;
}

int main(void)
{
    int array[] = {6,7,5};

    multTwo(array, sizeof(array)/sizeof(array[0]));

   return 0;
}
#包括
#包括
空心内底(内部*头部,内部*尾部)
{
内部温度;
如果(头<尾)
{
温度=*水头;
*头部=*尾部;
*尾=温度;
倒置(++头部,--尾部);
}
}
int*multTwo(int*arr,尺寸长度)
{
int值=0;
整数n_位数=0;
//将数组转换为数字
而(len--)
{
值+=*arr;
数值*=10;
arr++;
}
数值/=10;
//加倍
数值*=2;
//将其转换为缓冲区
int*位=malloc(sizeof(*位));
while((值>0)和&(数字!=NULL))
{
数字[n_digits++]=值%10;
数值/=10;
数字=realloc(数字,sizeof(*数字)*(n_数字+1));
}
如果(位数!=NULL)
{
反转(数字和数字[n_数字-1]);
printf(“[”);

对于(inti=0;i我能在短时间内思考的最好情况,比如面试

#include <stdio.h>
#include <stdlib.h>

void invert (int *head, int *tail)
{
    int temp;

    if (head < tail)
    {
        temp = *head;
        *head = *tail;
        *tail = temp;

        invert(++head, --tail);
    }
}

int* multTwo(int* arr, size_t len)
{
    int value = 0;
    int n_digits =0 ;

    // CONVERT THE ARRAY TO NUMBER
    while(len--)
    {
        value += *arr;

        value *=10;

        arr++;
    }

    value /= 10;

    // DOUBLE THE NUMBER
    value *= 2;

    // CONVERT IT TO BUFFER
    int *digits = malloc(sizeof(*digits));

    while ((value>0) && (digits != NULL))
    {
        digits[n_digits++] = value%10;

        value /= 10;

        digits = realloc(  digits, sizeof(*digits) * (n_digits+1) );
    }

    if (digits != NULL)
    {
        invert(digits, &digits[n_digits-1]);

        printf("[ ");

        for (int i=0; i<n_digits; i++)
            printf("%d, ", digits[i]);

        printf("]\n");
    }

    return digits;
}

int main(void)
{
    int array[] = {6,7,5};

    multTwo(array, sizeof(array)/sizeof(array[0]));

   return 0;
}
#包括
#包括
空心内底(内部*头部,内部*尾部)
{
内部温度;
如果(头<尾)
{
温度=*水头;
*头部=*尾部;
*尾=温度;
倒置(++头部,--尾部);
}
}
int*multTwo(int*arr,尺寸长度)
{
int值=0;
整数n_位数=0;
//将数组转换为数字
而(len--)
{
值+=*arr;
数值*=10;
arr++;
}
数值/=10;
//加倍
数值*=2;
//将其转换为缓冲区
int*位=malloc(sizeof(*位));
while((值>0)和&(数字!=NULL))
{
数字[n_digits++]=值%10;
数值/=10;
数字=realloc(数字,sizeof(*数字)*(n_数字+1));
}
如果(位数!=NULL)
{
反转(数字和数字[n_数字-1]);
printf(“[”);

对于(inti=0;i一些伪代码。主要思想是在面试中展示C语言知识的深度,而不是代码

什么签名

 // arr is not changed, use `const`
 // array indexing best done with `size_t`              
 int* multTwo(const int* arr, size_t len) {
所需大小并显示错误处理。当
len>0

 need = len;
 // if lead element is 5 or more, add 1.
 // Error if element is not in 0-9 range
分配内存。分配变量取消引用类型的大小比编码变量类型更不容易出错,更容易检查和维护。在C访问期间显示维护问题是一件好事。考虑一下以后的代码是否更改为
unsigned char*multTwo(const unsigned char*arr,size\t len){
,无需更改
newarr=malloc(sizeof*newarr*need)

检查分配。分配为0可以返回NULL。但是这个例程可能仍然应该分配1个字节,这有点浪费,以确保
NULL
返回是一个错误。与面试官讨论这样的问题是好的。这表明你想清楚地了解客户的需要,不仅仅是在函数的细节方面,而且是在c的角落阿斯

 if (newarr == NULL && need > 0) fail()
循环并填充新数组,就像使用有意义的变量名和无符号数组索引进行OP编码一样

 size_t arr_i=len;
 size_t newarr_i=need;
 int carry = 0;
 while (arr_i > 0) 
   sum = arr[--arr_i]*2 + carry;
   newarr[--newarr_i] = sum%10;
   carry = sum/10;
 }
 if (carry) {
   newarr[--newarr_i] = carry;
 }

Return
newarr

一些伪代码。主要目的是在面试中展示C语言知识的深度,而不是代码

什么签名

 // arr is not changed, use `const`
 // array indexing best done with `size_t`              
 int* multTwo(const int* arr, size_t len) {
所需大小并显示错误处理。当
len>0

 need = len;
 // if lead element is 5 or more, add 1.
 // Error if element is not in 0-9 range
分配内存。分配变量取消引用类型的大小比编码变量类型更不容易出错,更容易检查和维护。在C访问期间显示维护问题是一件好事。考虑一下以后的代码是否更改为
unsigned char*multTwo(const unsigned char*arr,size\t len){
,无需更改
newarr=malloc(sizeof*newarr*need)

检查分配。分配为0可以返回NULL。但是这个例程可能仍然应该分配1个字节,这有点浪费,以确保
NULL
返回是一个错误。与面试官讨论这样的问题是好的。这表明你想清楚地了解客户的需要,不仅仅是在函数的细节方面,而且是在c的角落阿斯

 if (newarr == NULL && need > 0) fail()
循环并填充新数组,就像使用有意义的变量名和无符号数组索引进行OP编码一样

 size_t arr_i=len;
 size_t newarr_i=need;
 int carry = 0;
 while (arr_i > 0) 
   sum = arr[--arr_i]*2 + carry;
   newarr[--newarr_i] = sum%10;
   carry = sum/10;
 }
 if (carry) {
   newarr[--newarr_i] = carry;
 }

Return
newarr
首先,我会查看
arr
中的第一个数字是否为5或更多,以检查
newarr
数组是否需要比原始数组大1

对于初始化,类似于这样:

int* newarr;
int  newlen;
if (*arr >= 5)
     newlen = len + 1; 
else
     newlen = len;

newarr = (int*)malloc(sizeof(int) * newlen);   
memset(newarr, 0, newlen); //initialize all newarr values to 0
显然,我们现在必须进行乘法运算。为了得到1的数字,我们使用模运算符
%
,为了得到10的数字,我们使用除法运算符
/
。当然,我们只需要在乘法值为10或更大的情况下进行除法运算。因此,填充
newarr
的循环将类似于此s:

int i, temp;
for (i = 1; i <= len; i++) {
    temp = *(arr + i - 1) * 2;
    if (temp < 10) {
        *(newarr + i - 1) += temp;
    }
    else {
        *(newarr + i - 1) += temp / 10; //inset 10's digit
        *(newarr + i) += temp % 10; //inset 1's digit 
    }

}
inti,温度;
对于(i=1;i=5)
newlen=len+1;
其他的
newlen=len;
newarr=(int*)malloc(sizeof(int)*newlen);
memset(newarr,0,newlen);//将所有newarr值初始化为0
int i,温度;

对于(i=1;i我将首先查看
arr
中的第一个数字是否为5或更多,以检查
newarr
数组是否需要大1