字符串的旋转

问题描述:
给定一个字符串,要求将字符串前面的若干个字符移动到字符串尾部
例:将abcdef前3个字符 a b c移到字符串尾部,原字符串变成defabc

解法一(暴力移位):
  • 每次将字符串首字符移动到字符串尾部(循环若干次)
void LeftShiftOne(char *s,int n)
{
    int t = s[0];//保存起始值
    for(int j=1;j<n;j++)
    {
        s[j-1] = s[j];
    }
    s[n-1] = t;//移到最后一位
}
void LeftRotateString(char *s,int n,int m)
{
    while(m--)
    {
        LeftShiftOne(s,n);
    }
}
int main()
{
    char str[] = "abcdef";
    int n = strlen(str);
    int m = 3;
    LeftRotateString(str,n,m);
    cout<<str<<endl;
    return 0;
}
解法二(三步反转):
  • 将原字符串分为X和Y两个部分,其中X为abc Y为def
  • 将X的所有字符串反转 abc->cba 将Y的所有字符串反转 def->fed
  • 将上述步骤得到的结果整体反转 cbafed -> defabc
void ReverseString(char *str,int from,int to)
{
    while(from < to)
    {
        int t = str[from];
        str[from++] = str[to];
        str[to--] = t;
    }
}
void LeftRotateString(char *str,int n,int m)
{
    ReverseString(str,0,m-1);//反转X
    ReverseString(str,m,n-1);//反转Y
    ReverseString(str,0,n-1);//整体反转

}
int main()
{
    char str[] = "abcdef";
    int n = strlen(str);
    int m = 3;
    LeftRotateString(str,n,m);
    cout<<str<<endl;
    return 0;
}

实战:
反转英文句子 eg:I am a student. 输出 :student. a am I
先反转整个句子 .tneduts a ma I
从前往后每个单词反转 student. a am I

void Reverse(char *arr,int left,int right)
{
    while(left < right)
    {
        char t = arr[left];
        arr[left++] = arr[right];
        arr[right--] = t;
    }
}
void ReverseWorld(char *str,int n)
{
    if(str == NULL || n <= 1) return ;
    int left = 0;
    int right = n-1;
    //整体反转
    Reverse(str,left,right);

    //从前往后每个单词反转
    left = 0;
    right = 0;
    while(right < n)
    {
        if(str[left] == ' ')
        {
            left++;
            right++;
        }
        if(str[right] == ' ')
        {
            Reverse(str,left,--right);
            left = ++right;
        }
        else
        {
            right++;
        }
    }
}
int main()
{
    char str[] = "I am a student.";
    int n = strlen(str);
    ReverseWorld(str,n);
    cout<<str<<endl;
}

进阶算法…

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值