左旋字符串

左旋字符串

1. 什么是左旋字符串?

把字符串前面的若干个字符移动到字符串尾部。

例如把 abcd 左旋转 2 位得到字符串 cdba。

2. 方式一

void left_remove(char arr[], int k)
{
    int length = strlen(arr);
    for (int i = 0; i < k; ++i)
    {
        //首先保存第一个位置元素
        char temp = arr[0];
        //将其后的元素依次前移一位
        for (int j = 0; j < length - 1; ++j)
        {
            arr[j] = arr[j + 1];
        }
        //将第一个字符放到最后
        arr[length - 1] = temp;
    }
}

图示:
在这里插入图片描述

3. 方式二(三步反转法)

例如字符串 abcdef ,若要左旋2个字符,只要按下述3个步骤操作即可:

  1. 首先分为俩部分,X:ab,Y:cdef;

  2. 将X反转,即得:ab->ba;将Y反转,即得:cdef->fedc。

  3. 反转上述得到的结果字符串,即bafedc给予反转,得cdefab。

    void left_remove2(char arr[], int k)
    {
        int length = strlen(arr);
        //首先将前k个字符逆序 例:abcdef(左旋2)->首先将前两个字符ab逆序->bacdef
        reverse(arr, arr + k - 1);
        //再将剩下的字符逆序  ->再将剩下的字符cdef逆序  ->  bafedc
        reverse(arr + k, arr + length - 1);
        //最后将整体逆序  ->再将整个的字符串bafedc逆序  ->  cdefab
        reverse(arr, arr + length - 1);
    }
    
    /**
     * 反转字符串函数
     * @param left  字符串开始位置地址
     * @param right  字符串结束位置地址
     */
    void reverse(char *left, char *right)
    {
        char temp;
        //当左地址小于右地址,依次交换左右两个位置元素(类似二分查找)
        while (left < right)
        {
            temp = *left;
            *left = *right;
            *right = temp;
            left++;
            right--;
        }
    
    

图示:
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值