免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: 陈良乔
打印 上一主题 下一主题

[C] 如何编写一个字符串循环移动函数? [复制链接]

论坛徽章:
0
21 [报告]
发表于 2012-12-06 15:07 |只看该作者
本帖最后由 JohnBull 于 2012-12-06 15:08 编辑

你是想原地循环还是求循环后的串?
后者的话,用一个两倍长的数组,把串重复放进2次,循环取

论坛徽章:
3
寅虎
日期:2013-11-27 07:53:29申猴
日期:2014-09-12 09:24:152015年迎新春徽章
日期:2015-03-04 09:48:31
22 [报告]
发表于 2012-12-06 15:39 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
11
摩羯座
日期:2013-09-16 11:10:272015亚冠之阿尔萨德
日期:2015-06-12 22:53:29午马
日期:2014-04-15 11:08:53亥猪
日期:2014-03-02 23:46:35申猴
日期:2013-12-06 22:07:00亥猪
日期:2013-11-28 12:03:13双鱼座
日期:2013-11-21 14:43:56亥猪
日期:2013-10-23 10:55:49处女座
日期:2013-10-17 18:15:43午马
日期:2013-09-27 17:40:4215-16赛季CBA联赛之青岛
日期:2016-06-22 00:45:55
23 [报告]
发表于 2012-12-07 15:29 |只看该作者
陈良乔 发表于 2012-12-06 10:52
你的copyright应该如何写呢?


啥意思呀?

论坛徽章:
5
狮子座
日期:2013-08-20 10:12:24午马
日期:2013-11-23 18:04:102015年辞旧岁徽章
日期:2015-03-03 16:54:152015亚冠之德黑兰石油
日期:2015-06-29 18:11:1115-16赛季CBA联赛之新疆
日期:2024-02-21 10:00:53
24 [报告]
发表于 2012-12-08 08:42 |只看该作者
恩,前段时间断网了,所以没法解答你的疑问。

我这里还有另外一种与他们都不同的算法,是我自己要解决这个问题的时候想出来的。

我是这么想的,假设字符串是aaabbb,即移位的两边长度相等,那么就很简单了,直接a1和b1交换,a2和b2交换,以此类推,就“移位”了。

如果不相等怎么办呢?我们假设a比较多,比如说aaaaabbb,我们总可以划分出一个相等的部分:[aaa][aa][bbb],然后我们将123变成321,这样字符串成了[bbb][aa][aaa],那么bbb就到了正确的位置,我们接下来要做的就是交换[aa]和[aaa]了,这个过程可以用刚才叙述的算法完成(递归 !)。

注意到每次交换,都必定有一个元素会到正确的位置上去,因此可以得出时间复杂度是O(n),而空间复杂度是O(1),思想是经典的分治法。

不过后来看到有人提反转法,我就把这个方法换成反转法了,似乎常数会小一点,嘿嘿~~

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
25 [报告]
发表于 2012-12-08 09:36 |只看该作者
小乔大概写程序都不测试结果的。
已经达到随手写、随手发布的境界。

http://chenlq.net/dev/cpp-why/57 ... time-and-space.html
最后这段程序,我怎么看怎么不对,运行试下,果然。
拍照留恋如下:

  1. #include <iostream>
  2. #include <cstring>
  3. char* movestr(char* str,const int n)
  4. {
  5.     const int LEN = strlen(str);
  6.     // 申请字符串长度的内存作为临时中转交换
  7.     char* p = new char[LEN+1];
  8.     if(nullptr != p)
  9.     {
  10.         // 使用memcpy()代替逐个字符的复制移动
  11.         memcpy(p,str+n,LEN-n);
  12.         memcpy(p+LEN-n,str,n);
  13.         p[LEN]='\0';
  14.         // 复制回原字符串
  15.         strcpy(str,p);
  16.         delete[] p;
  17.         p = nullptr;
  18.     }
  19.     return str;
  20. }
  21. int main()
  22. {
  23.     char str[] = "today is  sunday";
  24.     std::cout<<movestr(str,3)<<std::endl;
  25.     return 0;
  26. }
复制代码

论坛徽章:
2
程序设计版块每日发帖之星
日期:2015-06-17 22:20:00每日论坛发贴之星
日期:2015-06-17 22:20:00
26 [报告]
发表于 2012-12-19 00:47 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP