旋转字符串的秘密

      最近离谱张童鞋对字符串旋转,翻转等问题非常感兴趣,看了些视频以及做了一些题目,现在有一些新的想法以及后续学习的目标以及规划要分享给大家. 

目录:

1:介绍一下整体旋转字符串的2种方法
2:旋转单个字符,设计一个函数(两种方法,第一种是设计函数第二种是三步翻转法:特别巧妙,这里将会画图详细介绍.
3:题目1:旋转一个字符串然后单词也逆序.:

4:查找字符串,本题会把思路和代码详细的讲一遍.
好,接下来咱们先看这样一个问题

题目 :完成对一个字符串的逆序.
示例:abcd
输出:dcba
(偶数个)

示例:abcde
输出:edcba
(奇数个)

思路1:可以用循环来实现,把b一个字符串传入数组中,既然是数组,就可以用访问下标的形式来进行访问了,然后再倒序输出就行了
废话不多说,直接上代码(别急每一条代码后面有注释喔)

​
/*
方法1:for循环倒序输出:

思路:和倒序输入数字一样的,直接倒序打印就可以

*/

//已在编译器上测试过,没问题
#include <stdio.h>
#include <string.h>
int main()
{
    char s[1000]={0};//创建一个数组用来存放字符串,大小的话,注意题目规范,还有变量初始化,好习惯一定要养成
    scanf("%s",s);//输入字符串,也可以用gets
    int n=strlen(s);//求出有几个字母,顺便可以算出下标
    int i=0;//变量初始化,一定别忘了喔
    for(i=n-1;s[i]!='\0';i--)//从最后一个字母的下标开始倒序输出.
    {        
        printf("%c",s[i]);
              
      }
        
    return 0;
  }

​

总结:这就是思路1啦,不难理解,接下来我们看思路1(2).

/*

方法2:也是用循环来完成的,但不过这个是用数组来实现字符串交换的,和这个题目有一些些相似,但是本质也还是相同的

这个和鹏哥之前的字符串汇聚蛮相似的,所以我想把他们放到一起来看


*/
//已在编译器上测试过,没问题
#include<stdio.h>
#include<string.h>
int main()
{
    char arr[1000]={0};
    int left=0,right=0,i=0;
    scanf("%s",arr);//输入字符串的时候用gets也是可以的哟
    int n=strlen(arr);//这样我是把这样条件都一股脑的写在了for循环里面,大家也可以写在外面
    for(left=0,right=n-1;(right-left)>0;left++,right--)
    {
/*
1:这里注意一点就是,right-left>1可以不可呢?答案是不可以,因为如果你交换的是偶数的话,第五和第六个元素,6-5=1,条件不满足,就退出来了,所以还是当右下标大于左下标的时候,这样就可以啦

2:然后就可以实现字符串的交换了哟
先创建一个临时变量用来存放左下标的元素.这就和交换三个数是一模一样的,大家类比就好啦
由于交换的是字符类型,所以,一定得用char型来创建临时变量的哟

*/
       char t=0;
       t=arr[left];
       arr[left]=arr[right];
       arr[right]=t;
       
      }

//交换完毕之后,最后打印出来就好啦

    printf("%s",arr);
  
   return 0;
 }
 

现在我们来回顾一下字符串汇聚的那个题目把:题目所示:
编写代码,演示从多个字符从两段移动,向中间汇聚。

思路如下(字多,详细,请大家耐心阅读):
比如我让arr2的#号变成welcome bit

首先得创建两个数组arr1和arr2来存储这两个字符串儿

然后字符串的话,已经存放到了数组里面了,然后就可以采用访问数组下标的形式,定义左下标为0,右下标为sz-1.
,但是他不能算sz,因为他是个字符串,这时候就要了解一下strlen函数了,str是string是字符串,len是lengh是表示长度的的意思,所以,这个是strlen函数是这么由来的

那么所以left和right都应该等于什么呢?
int left=0;
int right=strlen(arr2)-1;

首先明确题目,是让arr1的每一个元素来传到arr2中对吧,所以就是让arr1的左下标来放入到arr2的左下标,同理的右坐标也是一样的.

因为咱们是每传一次,咱们看一下他这个变化对吧,就是在交换了之后面加一个打印就行了,

然后这个是一次,我让left++,和right减减,他是不是就可以向中间汇聚了呢?

所以是不是得加一个while循环啊,是不是,这个和二分查找是一样的,二分查得查找很多次啊.

好了,思路以及有了,代码如下

#include <stdio.h>
#include <stdio.h>
#include <string.h>
//已经在编译器上测试过
int main()
{
    char arr1[]="welcome bit";
    char arr2[]="###########";
    int left=0;
    int right=strlen(arr2)-1;
    while(left<=right)
    {
        arr2[left]=arr1[left];//一定要注意,不是(),是[]
        arr2[right]=arr1[right];
        printf("%s\n",arr2);//这样就每打印一行,加一下,效果是从中间汇聚的.
      //  sleep(1000);//手机上不能实现,停留,因为手机没有windows.h
        left++;
        right--;
    }
    return 0;
   }

 好了,回过神来了,好了这个数组交换的方法,大家肯定会了,然后现在来看函数是如何实现的吧

方法三,用一个函数来实现,这个函数我们就把他定义为字符交换函数把,

字符交换函数

思路就是:要想交换一个字符串,就得把这个字符串的首尾地址传给这个交换函数,然后用指针的形式来进行交换,而我们定义的这个函数就得用两个指针来进行接收啦

好了,这个思路大致有了以后,咱们就来说敲代码了嗷

(1):首尾地址>可以用数组名来表示,因为数组名就代表着首元素的地址,而末尾元素的地址,则是字符串长度-1

(2):当把参数传给自定义函数里面,我们可以用左下标指针和右下标指针来进行接收他们,

(3)可以用while循环,或者是for循环来进行交换,

那条件是什么呢,我们可以这样想,就是当我们的左下标<=右下标的时候,这样是不是就停止了交换了呢?

好,思路有了,代码如下:

#include<stdio.h>
#include<string.h>
void my_string_reverse(char*left,char*right)
{
//交换,这里的*和[]是一样哒
    while(left<right)
    {
        char t=*left;
 
  • 10
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值