Chinaunix首页 | 论坛 | 博客
  • 博客访问: 423513
  • 博文数量: 45
  • 博客积分: 4075
  • 博客等级: 上校
  • 技术积分: 666
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-24 18:09
个人简介

百度网页搜索部高级工程师 我的微博:http://weibo.com/pengwh85

文章分类

全部博文(45)

文章存档

2012年(3)

2011年(1)

2010年(19)

2009年(10)

2008年(12)

我的朋友

分类: C/C++

2009-09-04 17:10:01

把一串字符串“abcdefg”循环左转3个字符,即“defgabc”。
 
一种比较笨的方法是用一个辅助数组保存要旋转的子字符串(比如上例中的“abc”),然后把“defg”在原数组前移3个位置,再把“abc”从辅助数组复制回来。不过这样空间使用为n(n为字符串中字符的多少)。
 
编程珠玑里提到一个方法,只需要一个辅助的变量就可以实现。比如处理a时,先把a赋给辅助变量tmp,d移到a原来的位置,接着g移到d原来的位置,最后tmp(值为a)移动g原来的位置。其它的同理。算法实现如下:
 
/////////////////////////////////////////////////////////////////////////
#include
 
using namespace std;
 
void Rotate(char *array, const int i, const int n);
void Swap(char &a, char &b);
 
int main()
{
 int n = 9, i = 4, j = 0;     // n为字符串字符的个数,i为左转的个数
 char a[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i' };
 cout << "旋转前:";
 
 for (j = 0; j < n; ++j)
  cout << a[j] << "  ";
 
 cout << endl;
 Rotate(a, i, n);
 cout << "旋转后:";
 
 for (j = 0; j < n; ++j)
  cout << a[j] << "  ";
 cout << endl;
 
 return 0;
}
 
void Rotate(char *array, const int i, const int n)
{
 char tmp, index;
 int j, k;
 for (j = 0; j < i; ++j)
 {
  tmp = array[j];
  for (k = 0; (index = j + (k + 1) * i) < n; ++k)
   array[index-i] = array[index];
  
  array[index-i] = tmp;
 }
}
 
void Swap(char &a, char &b)
{
 char tmp = a;
 a = b;
 b = tmp;
}
阅读(1497) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~