Chinaunix首页 | 论坛 | 博客
  • 博客访问: 260168
  • 博文数量: 84
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 927
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-06 23:00
个人简介

growing

文章分类

全部博文(84)

文章存档

2017年(6)

2016年(61)

2015年(17)

我的朋友

分类: C/C++

2016-04-20 14:20:57

1.暴力旋转
while(循环次数--)
{
   
  1. void move_left(char arr[], int count)
  2. {
  3.     int i = 0;
  4.     int len = strlen(arr);
  5.     for (i = 0; i < count; i++)
  6.     {
  7.         char tmp = arr[0];
  8.         int j = 0;
  9.         for (j = 0; j < len-1; j++)
  10.         {
  11.             arr[j] = arr[j + 1];
  12.         }
  13.         arr[len - 1] = tmp;
  14.     }
  15. }
}
这种方法太麻烦,每次移动一个字符就得把其他的全部移动。时间复杂度O(N^2)
2. m 位m位的翻转,再把最后面剩下的不足m位的一个一个移到那m个前面,时间复杂度近似O(n)

  1. #include <iostream>
  2. using namespace std;
  3. #include <string>

  4. void Rotate(string &s,int m)
  5. {
  6.     if(s.size() == 0 || m <= 0)
  7.     {
  8.         return;
  9.     }
  10.     int first = 0,second = m;
  11.     int n = s.size();
  12.     int r = (n - m) - n%m;
  13.     while(r--)
  14.     {
  15.         swap(s[first++],s[second++]);
  16.     }
  17.     int Count = n - second;
  18.     while(Count--)
  19.     {
  20.         int i = second;
  21.         while(i > first)
  22.         {
  23.             swap(s[i],s[i - 1]);
  24.             i--;
  25.         }
  26.         first++;
  27.         second++;
  28.     }
  29.     cout << s;
  30. }
  31. int main()
  32. {
  33.     string s("abcdefghij");
  34.     Rotate(s,3);
  35.     return 0;
  36. }
优化:
(1)还是像2中m位m位翻转,不过移到最后,就不再是一位一位把剩下的移到那m个前面,而是把剩下的看成一个子串,用递归的方法来继续翻转,直到递归到我们想要的样子。
(2)前面也不变,到最后用第一种暴力旋转暴力解决。

4.三步旋转法
首先对前m位逆序,再对后面剩下的逆序,再对整个序列全部逆序。

  1. void reverse(char *str, int left, int right)
  2. {
  3.     while (left < right)
  4.     {
  5.         swap(str + left, str + right);
  6.         left++;
  7.         right--;
  8.     }
  9. }
  10. void move_left(char arr[], int count)
  11. {
  12.     int len = strlen(arr);
  13.     reverse(arr, 0, count - 1);
  14.     reverse(arr, count, len - 1);
  15.     reverse(arr, 0, len - 1);
  16. }


阅读(1402) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~