将N个字符的数组,循环右移K位。

本文介绍了一种高效的字符串反转方法,通过将字符串分为X和Y两部分并进行三次反转操作实现目标字符串的翻转,最终达到时间复杂度为O(N)的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求:时间复杂度为O(N)
思路:
将一个字符串分成两部分,X 和Y 两个部分,在字符串上定义反转的操作X^T,即把X 的所有字符反转(如,X=”abc”,那么X^T=”cba”),那么我们可以得到下面的结论:
(X^TY^T)^T=YX。显然我们这就可以转化为字符串的反转的问题了。
就拿abcdef 这个例子来说,若要让def 翻转到abc 的前头,那
么只要按下述3 个步骤操作即可:
1、首先分为俩部分,X:abc,Y:def;
2、X->X^T,abc->cba, Y->Y^T,def->fed。
3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。

void reverse(char*start, char*end)
{
    if (start == NULL || end ==NULL)
        return;
    while (start < end)
    {
        char tmp = *start;
        *start = *end;
        *end = tmp;
        start++;
        end--;
    }
}

void *left(char *s, int pos) //pos 为要旋转的字符个数,或长度
{
    int len = strlen(s);
    reverse(s, s + (pos - 1)); //如上,X->X^T,即abc->cba
    reverse(s + pos, s + (len - 1)); //如上,Y->Y^T,即def->fed
    reverse(s, s + (len - 1)); //如上,整个翻转,(X^TY^T)^T=YX,即cbafed->defabc。
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值