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;
}
Returnnewarr
一些伪代码。主要目的是在面试中展示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;
}
Returnnewarr
首先,我会查看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