声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2840|回复: 12

[C/C++] 也来一道编程练习题

[复制链接]
发表于 2010-10-27 11:54 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

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

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

使用道具 举报

 楼主| 发表于 2010-10-27 23:24 | 显示全部楼层
  1. void Ror(int arr[], int N, int n)
  2. {
  3.         int *pTemp;
  4.         int dim = n%N;
  5.         if(0 == dim)
  6.                 return;
  7.         pTemp = (int *)malloc(sizeof(int)*dim);
  8.         if(!pTemp)
  9.                 return;
  10.         memcpy(pTemp, arr+N-dim, sizeof(int)*dim);
  11.         memmove(arr+dim, arr, sizeof(int)*(N-dim));
  12.         memcpy(arr, pTemp, sizeof(int)*dim);
  13.         free(pTemp);
  14. }
复制代码
自己顶一下,去华为打酱油时候我的答案。

点评

赞成: 5.0
哈哈,嗯,是啊,库函数,连时间复杂度也解决了。。。都不知道内部跳转了几次。。。  发表于 2010-10-29 11:38
赞成: 5
您这个……工作量可全让库函数给干了啊,哈哈,编程的风格挺好的,学习了。  发表于 2010-10-28 14:21
发表于 2010-10-28 14:50 | 显示全部楼层
本帖最后由 Rainyboy 于 2010-10-28 17:54 编辑

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


  1. //Arr[0~Length] Avaliable
  2. void Ror(int Arr[],int Length,int n)
  3. {
  4.    n = n%Length;
  5.    int* tArr = (int*)malloc(sizeof(int)*Length);
  6.    if(!tArr||!n)
  7.        return;
  8.    for(int i=0;i<Length;++i)
  9.        tArr[(i+n)%Length] = Arr[i];
  10.    for(int i=0;i<Length;++i)
  11.        Arr[i] = tArr[i];
  12.    return;
  13. }
复制代码
.

点评

赞成: 5.0
赞成: 5
内存泄漏了。。。嘿嘿  发表于 2010-10-29 14:25

评分

1

查看全部评分

发表于 2010-10-28 17:49 | 显示全部楼层
为什么在跟你聊了“一行代码实现输出”的那个帖子之后,我现在写程序都会想把它们怎么写在一行里……

点评

赞成: 5.0
赞成: 5
我也是。。。总想最少的代码干最多的事。。。最后结果就是过几天回过头看自己看不懂。。。汗。。。  发表于 2010-10-29 11:39
发表于 2010-10-29 09:01 | 显示全部楼层
怎么一个右移写的那么复杂。呵呵。c看不懂!
def  f(x,n):
     x=x[:n-1]+x[n:]
     return x
右移动n位。呵呵!超级业余

点评

赞成: 5.0
赞成: 5
。。。splice。。。果然强大。。。哈哈  发表于 2010-10-29 11:39
赞成: 5
哈哈,python? smtmobly给解释解释呗  发表于 2010-10-29 09:18

评分

1

查看全部评分

发表于 2010-10-29 09:33 | 显示全部楼层
本帖最后由 smtmobly 于 2010-10-29 09:34 编辑

上面那个写反了!
def  f(x,n):
    x=x[len(x)-n:]+x[:len(x)-n]
    return x
x=[1,2,3,4,5,6,7]
print f(x,2)
就是将尾部的n位复制到前面啊!呵呵!
上面程序结果是
[6, 7, 1, 2, 3, 4, 5]
发表于 2010-10-29 09:59 | 显示全部楼层
回复 smtmobly 的帖子

果然很强大……
发表于 2010-10-29 10:13 | 显示全部楼层
呵呵,你开玩笑了!关键我不知道这个题目出的是什么意思
发表于 2010-10-29 10:17 | 显示全部楼层
回复 smtmobly 的帖子

我也不是很明白出题人的意图……坐等wqsong透露真相……
 楼主| 发表于 2010-10-29 11:44 | 显示全部楼层
回复 Rainyboy 的帖子

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

点评

你看,大家都给出了自己的答案……你是不是该表示点……  发表于 2010-10-29 12:14
发表于 2010-10-29 12:25 | 显示全部楼层
回复 wqsong 的帖子

内存的问题不是我考虑的!呵呵
看来写个软件都不容易啊!
 楼主| 发表于 2010-10-29 14:24 | 显示全部楼层
回复 smtmobly 的帖子

。。。嗯,C/C++考虑内存调试维护都费事,太容易内存泄漏了。
有人说在C/C++编写和调试是平行的。。。
;@P
发表于 2010-10-29 16:26 | 显示全部楼层
好吧,我修正……

  1. //Arr[0~Length] Avaliable
  2. void Ror(int Arr[],int Length,int n)
  3. {
  4.    n = n%Length;
  5.    int* tArr = (int*)malloc(sizeof(int)*Length);
  6.    if(!tArr||!n)
  7.        return;
  8.    for(int i=0;i<Length;++i)
  9.        tArr[(i+n)%Length] = Arr;
  10.    for(int i=0;i<Length;++i)
  11.        Arr = tArr;
  12.    free(tArr);
  13.    return;
  14. }
复制代码

您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-5-3 16:13 , Processed in 0.057276 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表