wqsong 发表于 2010-10-27 11:54

也来一道编程练习题

本帖最后由 wqsong 于 2010-10-27 12:05 编辑

写一个函数,实现整形数组循环右移位,要求空间复杂度不超过O(N)。
例如:
1 2 3 4 5右移两位变为4 5 1 2 3
题本身没难度,看怎么写了。
这是华为2010招聘,在哈尔滨的一道笔试题。

wqsong 发表于 2010-10-27 23:24

void Ror(int arr[], int N, int n)
{
        int *pTemp;
        int dim = n%N;
        if(0 == dim)
                return;
        pTemp = (int *)malloc(sizeof(int)*dim);
        if(!pTemp)
                return;
        memcpy(pTemp, arr+N-dim, sizeof(int)*dim);
        memmove(arr+dim, arr, sizeof(int)*(N-dim));
        memcpy(arr, pTemp, sizeof(int)*dim);
        free(pTemp);
}自己顶一下,去华为打酱油时候我的答案。

Rainyboy 发表于 2010-10-28 14:50

本帖最后由 Rainyboy 于 2010-10-28 17:54 编辑

老老实实写一下,也许是这样的……总觉得落到出题人的陷进里面了……不过应该是O(N)吧……


//Arr Avaliable
void Ror(int Arr[],int Length,int n)
{
   n = n%Length;
   int* tArr = (int*)malloc(sizeof(int)*Length);
   if(!tArr||!n)
       return;
   for(int i=0;i<Length;++i)
       tArr[(i+n)%Length] = Arr;
   for(int i=0;i<Length;++i)
       Arr = tArr;
   return;
}.

Rainyboy 发表于 2010-10-28 17:49

为什么在跟你聊了“一行代码实现输出”的那个帖子之后,我现在写程序都会想把它们怎么写在一行里……

smtmobly 发表于 2010-10-29 09:01

怎么一个右移写的那么复杂。呵呵。c看不懂!
deff(x,n):
   x=x[:n-1]+x
   return x
右移动n位。呵呵!超级业余

smtmobly 发表于 2010-10-29 09:33

本帖最后由 smtmobly 于 2010-10-29 09:34 编辑

上面那个写反了!
deff(x,n):
    x=x+x[:len(x)-n]
    return x
x=
print f(x,2)
就是将尾部的n位复制到前面啊!呵呵!
上面程序结果是

Rainyboy 发表于 2010-10-29 09:59

回复 smtmobly 的帖子

果然很强大……

smtmobly 发表于 2010-10-29 10:13

呵呵,你开玩笑了!关键我不知道这个题目出的是什么意思

Rainyboy 发表于 2010-10-29 10:17

回复 smtmobly 的帖子

我也不是很明白出题人的意图……坐等wqsong透露真相……

wqsong 发表于 2010-10-29 11:44

回复 Rainyboy 的帖子

其实我也不知道他们的目的,最主要是看思路吧。。。
当时做题的时候我就想华为偏向于硬件操作,就故意用内存直接拷贝。。。一面的时候那面试官还说我那写法操作内存太赤裸了。。。:lol

smtmobly 发表于 2010-10-29 12:25

回复 wqsong 的帖子

内存的问题不是我考虑的!呵呵
看来写个软件都不容易啊!

wqsong 发表于 2010-10-29 14:24

回复 smtmobly 的帖子

。。。嗯,C/C++考虑内存调试维护都费事,太容易内存泄漏了。
有人说在C/C++编写和调试是平行的。。。
;@P

Rainyboy 发表于 2010-10-29 16:26

好吧,我修正……

//Arr Avaliable
void Ror(int Arr[],int Length,int n)
{
   n = n%Length;
   int* tArr = (int*)malloc(sizeof(int)*Length);
   if(!tArr||!n)
       return;
   for(int i=0;i<Length;++i)
       tArr[(i+n)%Length] = Arr;
   for(int i=0;i<Length;++i)
       Arr = tArr;
   free(tArr);
   return;
}
页: [1]
查看完整版本: 也来一道编程练习题