考一个比较经典的问题(2)

zjxiaoyu 2005-07-13 05:12:44
将n个元素的数组向左旋转i个位置(循环旋转)。
比如abcdefg向左旋转3个位置就是defgabc。
写简单的代码实现。
...全文
645 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
netfloator 2005-07-14
  • 打赏
  • 举报
回复
这道题如果用到临时空间就太简单了,题目也失去了意义。我在学数据结构的时候看到过这道题。
Willpro 2005-07-14
  • 打赏
  • 举报
回复
www.mark.com
boxban 2005-07-14
  • 打赏
  • 举报
回复
前面各位大虾作得都不错,但个别有些小纰漏:
1。memcpy/memmove 里面的数量是以“字节”为单位计算的,因此对于int类型,应该是元素数目*sizeof(int)

2。应该考虑i > n 的情形,因此在处理前需做一个简单的检查:i %= n; if (i > 0) ....
jixingzhong 2005-07-14
  • 打赏
  • 举报
回复
或者用楼主的办法::

char a[100]; //100 is the max len!!

inverse(int p,int q);

{
//a[p] 到 a[q] 逆向
}


main()
{
int i,n; //输入N(字符串的长度),I(定位)
//加入输入字符串语句
inverse(0, i-1);
inverse(i, n-1);
inverse(0, n-1);
//输出!!
}
jixingzhong 2005-07-14
  • 打赏
  • 举报
回复
void recl(int *c,int n,int i)//c这数组,n为数组大小,i为起始位置
{
int *buf = new int[n];
memmove(buf,c+i,n-i);
memmove(buf+n-i,c,i);
memmove(c,buf,n);
delete[] buf;
return;
}



呵呵 ,原理是一样的。
RoninBlade 2005-07-14
  • 打赏
  • 举报
回复
不怎么会c语言。
如果可以使用copy的话,不如把给定的数据串复制一个一样的 "abcde" + "abcde"
移动几位,就从第几位开始取子串。
zjxiaoyu 2005-07-14
  • 打赏
  • 举报
回复
讨论的差不多了。欢迎进入下一个话题
http://community.csdn.net/Expert/topic/4144/4144339.xml?temp=.2981989

(附:上一个话题。 ;-)
http://community.csdn.net/Expert/topic/4142/4142186.xml?temp=.5108454
)
zjxiaoyu 2005-07-14
  • 打赏
  • 举报
回复
我开这个帖子的愿意原意是:用memcpy反复移的方法,中间内存要求比较高。而用1个中间变量反复循环写的方式那些边界调起来很繁琐,不够清晰。而那个3次转置的代码写起来就非常清晰,用书上的话说就是“想出错都难”,而且执行效率跟前面的差不多。
况且,如果要扩展的话,这种方法在将向量abc转换成为cba时,或者更长的时候,特别有效。
hackingtruth 2005-07-14
  • 打赏
  • 举报
回复
学习
spyol 2005-07-14
  • 打赏
  • 举报
回复
受教了~
K 2005-07-13
  • 打赏
  • 举报
回复
学习中
迷你苑 2005-07-13
  • 打赏
  • 举报
回复
学习中
wq_princess 2005-07-13
  • 打赏
  • 举报
回复
void left_cycle( char *d, int num )
{
int i, j;
char temp;
int len = 0;

while( d[len] != '\0' )
len ++;

for( i = 0; i < num; i ++ )
{
temp = d[0];
for( j = 0; j < len - 1; j ++ )
{
d[j] = d[j+1];
}
d[j] = temp;
}
}
whatsouta 2005-07-13
  • 打赏
  • 举报
回复

malloc

char *a = (char *)malloc(sizeof(char)*n);
if (a == NULL) exit(1); //用之前最好检查一下有没有申请内存成功
...
...
free(a);
aiguozhou 2005-07-13
  • 打赏
  • 举报
回复
我是新手,请问如果用C语言写的话,也能象上面各位大哥说的这样
char *b=new char[n];

new 一个新的数组么??
shizhen 2005-07-13
  • 打赏
  • 举报
回复
icansaymyabc(学习与进步)
做得漂亮:)
FBIq 2005-07-13
  • 打赏
  • 举报
回复
#define N 10
void main(void)
{
char a[N]="risdfght",temp[N];
int i=0,j,n;
printf("转之前%s\n",a);
printf("到转几位(1~4)");
scanf("%d",&n);
for(j=strlen(a)-n;a[j]!=0;j++)
temp[i++]=a[j];
for(j=0;j<strlen(a)-n;j++)
temp[i++]=a[j];
temp[i]=0;
printf("\n转之后%s",temp);
getch();
return;
}
icansaymyabc 2005-07-13
  • 打赏
  • 举报
回复
void lrota(char *a,int n,int i)
{
char *b=new char[n];
strncpy(b,a,n);
for(int j=0;j<n;j++) a[j]=b[(j+i)%n];
delete []b;
}

int main(int argc, char* argv[])
{
char buf[]={"abcdefghijklmn"};
printf("%s\n",buf);
lrota(buf,sizeof(buf)-1,3);
printf("%s\n",buf);
return 0;
}

zjxiaoyu 2005-07-13
  • 打赏
  • 举报
回复
这种方法在将向量abc转换成为cba时,特别有效。
zjxiaoyu 2005-07-13
  • 打赏
  • 举报
回复
哦。不错。有了memcpy确实比自己实现循环简单多了。
那个,书上说了另外一种方法。就是:
比如前i个元素通称为向量a,后面的称为b。a先自己反转,就是第一个元素放最后,第二个放倒数第二。然后b自己反转。最后整个大数组再反转一次。
就是
inverse(0, i-1);
inverse(i, n-1);
inverse(0, n-1);
加载更多回复(1)

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧