c语言左旋转字符串,思想,解析

什么是左旋呢?

 

就是第一个字符放到最后一个字符呀!然后第二个字符和最后的字符依次往前挪。

举个例子就知道了

eq:char arr1[10] = "ABCDEF"// 1

       char arr2[10] = "BCDEFA"//  2

这样就是说arr2是arr1左旋一次的值啦!


首先写好主体先哦

void string_rotate(char* arr, int k)
{
 
}


int main()
{
    //实现字符串的向左旋转
    int k = 2;//要向左旋转的次数
    char arr[10] = "ABCDEF";//要旋转的字符串

    string_left_rotate(arr , k);//多么霸气的函数名

    printf("旋转后的字符串:%s\n", arr);//打印旋转后的字符串

    return 0;
}


那这个自定义函数该怎么写呢?

首先咱们要学会把问题转换为图,反正我不转化为图,我是理解不了的


 然后我把所有代码放在下面

void string_left_rotate(char* arr, int k)
{
    assert(arr);//不允许传空指针
    int len = strlen(arr);//计算字符串的长度
    char temp = 0;
    int i = 0;
    int j = 0;
    for (i = 0; i < k; i++)
    {
        temp = *arr;//首个元素赋值给temp

        for (j = 0; j < len - 1; j++)
        {
            *(arr + j )= *(arr + 1 + j);//总共把len-1的元素往前挪移
        }
        *(arr + len - 1) = temp;//把首个元素放到最后
    }
    
}

里面如果有哪个库函数不懂的或者头文件不知道的可以去www.cplusplus.com找哦

那写完这个代码之后,可以运行,我们的任务就结束了么?

当然不,我们还要想其他的办法,是不是还要其他的办法,所以下面我再写一个办法


名字叫做三步反转法    牛吧!

那三步反转法怎么搞呢,那么我继续画图来给你们解释

同样的先写出代码主体


void reverse(char* left, char *right)
{
   
    
}
void string_left_rotate(char* arr, int k)
{
  
}
int main()
{
    //三步反转法
    
    int k = 4;//要向左旋转的个数

    char arr[10] = "ABCDEF";

    string_left_rotate(arr, k);

    printf("旋转后的字符串:%s\n", arr);

    return 0;
}



 代码如下

void reverse( char* left,  char *right)
{
    assert(left);//不允许传空值
    assert(right);//不允许传空值
    while (left < right)//left与right这里是指地址
    {
        char temp = *left;//解引用后就是所对应地址的字符
                          //所以没有解引用的指针看作为地址,解引用后的指针看作为值
        *left = *right;
        *right = temp;
        left++;
        right--;//实现在规定的范围(left和right之间)的交换
    }
    
}
void string_left_rotate(char* arr, int k)
{
    assert(arr);//不允许传空值

    int len = strlen(arr);//字符串总长度

    reverse(arr, arr + k - 1);//反转前k个
    reverse(arr + k, arr + len - 1);//反转后len - k个
    reverse(arr, arr + len - 1);//整体反转
}


总结:这个左旋让我感觉很像数据结构的顺序表插入,不过我还是用来理解指针的使用,指针很重要,也不好学,我感觉还是得多刷题,在题中理解知识点,并且希望大佬来指正下,看有没有需要改进的地方,还有这个左旋的问题还有很多解法,不单单这一种解法,在一本叫做《程序编程艺术》中就有全部的解法,但他的方法就是所有的方法了么?还需要你去探索哦!


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值