查看: 3863| 回复: 20
跳转到指定楼层
上一主题 下一主题
收起左侧

[字符串] 左旋字符串求助

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 lhy1987 于 2012-11-12 05:05 编辑

定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。
如把字符串abcdef左旋转2位得到字符串cdefab。
请实现字符串左旋转的函数,要求对长度为n的字符串操作的时间复杂度为O(n),空间复杂度为O(1)。

我的解法是这样的:

  1. void spin(char *str, int i, int j){

  2. while(1){
  3.     if(str == 0||*(str+j+1)=='\0')           break;
  4.     if(j<i) break;
  5.     if((j-i+1)>strlen(str+j+1)){
  6.         int p = i, q=j+1;
  7.         char temp;
  8.         while(*(str+q)!='\0'){
  9.             temp = *(str+p);
  10.             *(str+p) = *(str+q);
  11.             *(str+q) = temp;
  12.             p++;
  13.             q++;
  14.         }
  15.         i =p;
  16.     }else{
  17.         int p = i, q=j+1;
  18.         char temp;
  19.         while(p<=j&&*str+q!='\0'){
  20.             temp = *(str+p);
  21.             *(str+p) = *(str+q);
  22.             *(str+q) = temp;
  23.             p++;
  24.             q++;
  25.         }
  26.         i=p;
  27.                 j=q-1;
  28.     }
  29.         }

  30. }
复制代码
请问只是O(n)的解法吗?

上一篇:Compression BST
下一篇:【七类排序】之第一种:冒泡排序
🔗
Henry1324 2012-11-11 21:48:34 | 只看该作者
全局:
递归…… 空间复杂度…… 呃……
回复

使用道具 举报

🔗
annielife 2012-11-11 22:08:07 | 只看该作者
全局:
本帖最后由 annielife 于 2012-11-11 22:09 编辑

你是要练习指针的使用?给个麻烦的解法:

解法(数组):
int main()
{
    string str;
    int str_len;
    int left_move;
    char * ptr;
    cin>>str;
    str_len = strlen(str);
    cin>>left_move;
    ptr = (&str+left_move);
    for (int i = left_move; i<str_len; i++)
    {
        cout<< *(&str+i);
    }
    for (int j = 0; j<left_move; j++)
    {
        cout<< *(&str+j);
    }
}
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-11-12 04:56:35 | 只看该作者
全局:
annielife 发表于 2012-11-11 22:08
你是要练习指针的使用?给个麻烦的解法:

解法(数组):

你这个不行。。 只是输出,要求是转换成另外一个字符串,并且要求时间空间,空间复杂度。
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-11-12 04:57:17 | 只看该作者
全局:
Henry1324 发表于 2012-11-11 21:48
递归…… 空间复杂度…… 呃……

你说的对,不能用递归。。 忘了这茬了。。。
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-11-12 05:10:22 | 只看该作者
全局:
Henry1324 发表于 2012-11-11 21:48
递归…… 空间复杂度…… 呃……

现在呢? 改成不用递归的了。思路是这样的abcdef -> cdabef -〉cdefab,  我计算时间复杂度是设要移动的字符串长度为m,总长为n, 那么需要操作的次数是(n/m-1)*m = n-m;  所以我觉得应该是个时间复杂度为n的解法。 不过还不是很确定,所以发上来和大家讨论下
回复

使用道具 举报

🔗
Henry1324 2012-11-12 14:55:45 | 只看该作者
全局:
lhy1987 发表于 2012-11-12 05:10
现在呢? 改成不用递归的了。思路是这样的abcdef -> cdabef -〉cdefab,  我计算时间复杂度是设要移动的字 ...

学识有限 真心看不懂这些i j k变量名……
回复

使用道具 举报

🔗
annielife 2012-11-12 19:14:21 | 只看该作者
全局:
lhy1987 发表于 2012-11-12 04:56
你这个不行。。 只是输出,要求是转换成另外一个字符串,并且要求时间空间,空间复杂度。

那就把输出改成存到另外一个string里面应该就可以了,其实是一回事
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-11-13 07:55:16 | 只看该作者
全局:
annielife 发表于 2012-11-12 19:14
那就把输出改成存到另外一个string里面应该就可以了,其实是一回事

空间复杂度。。。
回复

使用道具 举报

🔗
 楼主| lhy1987 2012-11-13 07:56:04 | 只看该作者
全局:
Henry1324 发表于 2012-11-12 14:55
学识有限 真心看不懂这些i j k变量名……

谢谢,写得不好,不详细,不规范。 勿怪
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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