字符串循环右移N位

berryluo 2009-10-30 03:44:13
给一个长度为n的字符串,把这个字符串循环右移N位(0<N<n),要求只用O(1)的额外空间和O(N)时间,有些什么方法?
...全文
2470 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
heroxfcy 2012-10-03
  • 打赏
  • 举报
回复
额,,错了。。。。
heroxfcy 2012-10-03
  • 打赏
  • 举报
回复
比 n 小
heroxfcy 2012-10-03
  • 打赏
  • 举报
回复
#include<stdio.h>
#include<string.h>
void swap(char *a,char *b)
{
char c=*a;*a=*b;*b=c;
}
void fun(char *q,int s)
{
int i,n=strlen(q);
for(i=0;i<s/2;i++)
{
swap(q+n-s+i,q+n-i-1);
}
for(i=n-s-1;i>=0;i--)
swap(q+i,q+i+s);
}
int main()
{
char A[]="abcdefg";
fun(A,2);
puts(A);
return 0;
}
  • 打赏
  • 举报
回复
忘记了一句
结尾加上
Free(Str2);
  • 打赏
  • 举报
回复
void StrMove()
{
int n = 3; //右移几位,可以大于字符串长度
int len,i;
char Str1[]="abcdefg";
char* Str2;
len = strlen(Str1);
Str2 = (char*)malloc((len+1) * sizeof(char));
memset(Str2, 0, (len+1) * sizeof(char));
for (i = 0; i < len; i++)
{
*(Str2+i) = Str1[(i + n)%len];
}
strcpy(Str1,Str2);
printf("Str1:%s\n",Str1);

}
screwzm 2011-09-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 whg01 的回复:]

引用 1 楼 xsj_guagua 的回复:
给出一个字符串,右移N位,则我们将原字符串分为两部分来考虑
X1部分为右移的N位字符(移位后在字符头),X2部分为剩下n-N位字符(移位后在字符尾)
算法为:对原先的字符串x2x1,将x1,x2分别逆置,然后再将字符串整体逆置,就得移位后的字符串x1x2

这个算法实质上也就是个swap函数


正解。结贴吧。
[/Quote]
学习了!
myhouse_wolf3 2011-06-07
  • 打赏
  • 举报
回复
根据2L想法而写的具体实现,如下:
#include<iostream>
#include <string>
using namespace std;
int main()
{
int N;
string str;
cout<<"请输入要循环右移的字符串:"<<endl;
cin>>str;
cout<<"请输入要循环右移的位数N:"<<endl;
cin>>N;
//int i=strlen(&s[0])-1;
int n=str.size()-1;
char temp1,temp2,temp3;
for(int i=0;i<(n-N+1)/2;i++)
{temp1=str[i];str[i]=str[n-N-i];str[n-N-i]=temp1;}
for(i=n-N+1;i<(n-N+1)+N/2;i++)
{
temp2=str[i];
str[i]=str[2*n-N-i+1];
str[2*n-N-i+1]=temp2;
}
for(i=0;i<(n+1)/2;i++)
{ temp3=str[i];str[i]=str[n-i];str[n-i]=temp3;}
cout<<"字符串循环右移"<<N<<"位后结果为:"<<endl;
cout<<str<<endl;
return 0;
}
berryluo 2009-10-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 cangyingzhijia 的回复:]
这个问题不可能在o(N)时间内完成,因为最节省的做法是:
for(i=0;i <N;i++){
  t = s[j];
  for(j = n-i;j-N > 0;j = j-N){
      s[j] = s[j-N];
  }
  s[j] = t;

}

[/Quote]

一楼已经给出的“翻手算法”就可以是O(N) 的了呀,怎么会不可能有O(N)的呢。。。。
mstlq 2009-10-30
  • 打赏
  • 举报
回复
这个问题……
请楼主参考《编程珠玑》第二章第三节^_^
cdsn下载频道应该有提供^_^
苍蝇①号 2009-10-30
  • 打赏
  • 举报
回复
这个问题不可能在o(N)时间内完成,因为最节省的做法是:
for(i=0;i<N;i++){
t = s[j];
for(j = n-i;j-N > 0;j = j-N){
s[j] = s[j-N];
}
s[j] = t;

}
kxalpah 2009-10-30
  • 打赏
  • 举报
回复
翻手算法,学习了
berryluo 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xsj_guagua 的回复:]
给出一个字符串,右移N位,则我们将原字符串分为两部分来考虑
X1部分为右移的N位字符(移位后在字符头),X2部分为剩下n-N位字符(移位后在字符尾)
算法为:对原先的字符串x2x1,将x1,x2分别逆置,然后再将字符串整体逆置,就得移位后的字符串x1x2

这个算法实质上也就是个swap函数

[/Quote]

这个解法不错,还有更好的么?
berryluo 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 li32768 的回复:]
一楼是正解,吧分给人家吧,这个确实是一个很大的技巧在里面了的
[/Quote]
期望还能有更好的解法,能否只“翻”一次呢?一楼的解法我也见过了
berryluo 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 selooloo 的回复:]
引用 7 楼 die_angle 的回复:
2楼的做法不对,其时间复杂度为N*n

只有一个循环,哪来的n呢,
[/Quote]

二楼的是N*n.....memcpy是O(n)的,strlen(str)也是O(n)的。。。
selooloo 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 die_angle 的回复:]
2楼的做法不对,其时间复杂度为N*n
[/Quote]
只有一个循环,哪来的n呢,
die_angle 2009-10-30
  • 打赏
  • 举报
回复
2楼的做法不对,其时间复杂度为N*n
li32768 2009-10-30
  • 打赏
  • 举报
回复
一楼是正解,吧分给人家吧,这个确实是一个很大的技巧在里面了的
heis07w 2009-10-30
  • 打赏
  • 举报
回复
翻手法:两手先后各自翻,再两手一起翻一下即换位了
whg01 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 xsj_guagua 的回复:]
给出一个字符串,右移N位,则我们将原字符串分为两部分来考虑
X1部分为右移的N位字符(移位后在字符头),X2部分为剩下n-N位字符(移位后在字符尾)
算法为:对原先的字符串x2x1,将x1,x2分别逆置,然后再将字符串整体逆置,就得移位后的字符串x1x2

这个算法实质上也就是个swap函数

[/Quote]
正解。结贴吧。
liangyonglou 2009-10-30
  • 打赏
  • 举报
回复
学习啊
加载更多回复(2)

70,020

社区成员

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

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