编程珠玑-第二章(字符串旋转与排序)

关于字符串旋转的一些想法
注意:区别字符旋转和字符串倒序排列的区别,旋转为abcd-》cdad
1.杂耍算法
特点:可以在空间有限的情况下解决问题,但是缓存性能差。

#include <iostream>
#include <assert.h>
using namespace std;

/*获取m和n的最大公约数*/
int GCD(int m,int n)
{
    int tmp;
    if (m < n)
    {
        tmp = m;
        m = n;
        n = tmp;
    }//调整数字大小顺序
    if (m % n == 0)
    {
        return n;
    }
    else
    {
        return GCD(n,m%n);//此处使用的是辗转相除法来求最大公约数
    }
}


void RotateString(char* str,int k)
{
    assert(str != NULL && k > 0);
    int strLen = strlen(str);
    int GCDNum = GCD(strLen,k);

    for (int i = 0;i < GCDNum;i++)//最大公约数即是循环的次数
    {
        int first = i;
        int next = (first + k) % strLen;
        char tmp = str[i];

        while(next != i)//移位停止的条件是当下一个元素移位回到起始点
        {
            str[first] = str[next];
            first = next;
            next = (first + k) % strLen;
        }
        str[first] = tmp;//临时存储的变量最后单独赋值
    }
}

int main()
{

    char str[30] = "abcdef";
    RotateString(str,3);
    cout<<str<<endl;
    return 0;

2.可以使用求逆的方式
将总字符分成两个部分,先分别倒排,再整体倒排一次。例如12345-32145-32154-45123

reverse(0,i-1);
reverse(i,n-1);
reverse(0,n-1);
void reverse(char* str,int start,int end)
{
    char temp;
    int mid = (start + end)/2;
    for(int i = start,int j = end;i < = mid;i++,j++)
    {
        temp = str[start];
        str[start] = str[end];
        str[end] = temp;
    }
}

3.块交换,首先将额外使用一块内存(一个临时数组),将要交换的块1进行一个拷贝,在块2变换之后,将块1拷贝放回。
参考:http://www.cnblogs.com/solidblog/archive/2012/07/18/2596683.html

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值