编程珠玑(二)

将一个具有n个元素的一维向量向左旋转i个位置,n=8,i=3,abcdefgh--defghabc

//将一个具有n个元素的一维向量向左旋转i个位置,n=8,i=3,abcdefgh--defghabc
#include <iostream>
#include <time.h>
using namespace std;

//--方法一:先移动一位,然后移动i位即可
void OneStep(char* ch,int n)
{
    char t=ch[0];
    for (int i=1;i<n;i++)
        ch[i-1]=ch[i];
    ch[n-1]=t;
}
void Moveto(char* ch,int n,int i)
{
    i=i%n;
    for (int j=0;j<i;j++)
    {
        OneStep(ch,n);
    }
}
//--方法二:先将前面部分存储起来,然后移位并复制
void StoreMove(char* ch,int n, int i)
{
    int j;
    i%=n;
    char* tmp=new char[i];
    for (j=0;j<i;j++)
    {
        tmp[j]=ch[j];
    }
    for (j=i;j<n;j++)
    {
        ch[j-i]=ch[j];
    }
    for (j=0;j<i;j++)
    {
        ch[n-i+j]=tmp[j];
    }
}
//--方法三:先将ch[0]放入t中,然后隔位移动
void SmallStoreMove(char* ch,int n,int i)
{
//    int j;
    i%=n;

}
//--方法四:不停的翻转
void Reverse(char* start, char *end)
{
    char t;
    while (start<=end)
    {
        t=*start;
        *start=*end;
        *end=t;
        start++;
        end--;
    }
}
void ReverseMove(char* ch,int n,int i)
{
    Reverse(ch,ch+i-1);
    Reverse(ch+i,ch+n-1);
    Reverse(ch,ch+n-1);
}
void main()
{
    char ch[]="abcdefgh";
//    OneStep(ch,8);
//    Moveto(ch,8,3);
//    StoreMove(ch,8,3);
//    Reverse(ch,ch+4);

    ReverseMove(ch,8,3);
    
    cout<<ch<<endl;

  
}
原文地址:https://www.cnblogs.com/lscheng/p/2744669.html