PTA C语言 7-31 字符串循环左移

题目

 解题思路:

    看到这个左移动的时候就想到了 之前看的一个视频,原理和这个类似。

      左移k个元素,就先把前 k 个元素 逆序,再把后面剩下的元素逆序,然后再整体逆序;举个例子:

      假如说输入的字符串是 "hello world!", k  = 2  ,我们先把 "he" 逆序 然后再把 "llo world!"逆序

然后再对逆序之后的再逆序一次,就可以的我们要想要的结果。 

因为要使用多次逆序,我选择把逆序写成一个函数,使用时直接调用即可。

逆序:

   通过传入的左右指针我们知道需要逆序的位置

   当k =2 时,我们需要逆序的是 he这里,这时候指针指向的位置是

 指针-指针表示的是两个指针之间的元素个数,加上1 为要逆序的个数,再除以2表示要执行几次交换。k=2是 只需要交换一次 k = 5时 交换三次,当执行第三次的时候 left 和right指向同一个位置,不满足条件就会退出。(不加  left != right 也是可以过的 只不过会多进行一次浪费一点点时间)

 逆序的过程就是 交换左右的值 然后左右指针再同时向中间靠近。

我通过i 作为下标进行输入,同时 i 也作为记录输入字符长短的工具,i的值也就是\n出现之前的字符串的长度。

当k输入的过大时我们还需要注意,如果k == i 那就是一整个逆置一圈,相当于没有逆置,当k的值大于i 时,实际上逆置的次数只有 k%i 次 所以 我用  k = k%i 来规范 输入的K ,当然也可以写成k%=i  ;

 

 最后只需要在main()函数里调用三次 逆序函数就可以了,下面是代码:

#include <stdio.h>
void my_switch(char* left, char* right);
int main()
{
    char ch[100] = { 0 };
    int k = 0;
    int  i = 0;
    ch[i] = getchar();
    while (ch[i] != '\n')
    {
        i++;
        ch[i] = getchar();
    }
    scanf("%d", &k);
    k = k%i ;
    //先逆序 0 - k-1 所有的元素
    my_switch(&ch[0], &ch[k - 1]);
    //再逆序 k-1 -sz-1所有的元素
    my_switch(&ch[k], &ch[i -1]);
    //最后 逆序所有的元素
    my_switch(&ch[0], &ch[i -1]);
    for (int j = 0; j < i; j++)
    {
        printf("%c", ch[j]);
    }
    return 0;
}

//使用一个左边值和一个右值
void my_switch(char *left, char* right)
{
    int x = (right - left + 1) / 2;
    for (int i = 0; i < x && right != left; i++)
    {
        char tmp = *left;
        *left = *right;
        *right = tmp;
        left++;
        right--;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值