倒置字符串

简介: 倒置字符串

字符串的倒置例子

字符串倒置可以用递归的方法,也可以用非递归的方法;

1.非递归方法介绍:定义两个指针变量,分别指向该字符串的头和字符串的尾,对两个指针指向的地址做循环判断,是否前面指针指向的地址小于后面指针指向的地址,循环里面交换两个指针所指向的字符,利用一个中间变量,然后前面的指针++;后面的指针减减;

void reverse(char* l, char* r)
{
  while (l < r)//判断前地址是否小于后地址
  {
    int tmp = *l;
    *l = *r;
    *r = tmp;//交换字符
    l++;前指针后移
    r--;后指针前移
    }
}
int main()
{char arr[] = "abcdef";
int len = strlen(arr);//获取字符长度
char* left = arr;//指针指向前面
char* right = arr+len-1;//指针指向后面
reverse(left, right);//字符交换函数传入两个地址
printf("%s", arr);
}

2.递归方法介绍:比如说是abcdef,递归的话可以写个递归函数交换a和f,然后再用bcde去调用这个函数,这个条件的话就是字符串的长度大于等于2的话才去交换,小于2就结束

void reverse(char*str)                第一次调用arr[]=abcdef\0

{

int sz = strlen(str);

char tmp = *str;                   tmp=a;

*str = *(str + sz - 1);            arr[]=fbcdef\0  //理解为在对应地址上做变化,别的地址上的不变

*(str + sz - 1) = '\0';           arr[]=fbcde\0\0 //理解为在对应地址上做变化,别的地址上的不变

if (strlen(str + 1) >= 2)

reverse(str + 1);           reverse(str + 1);递归一次

                                传入第二次调用

*(str + sz - 1) = tmp;               arr[]=bcdef\0  //理解为在对应地址上做变化,别的地址上的不变

                                   *(str + sz - 1) = tmp; 先不执行

void reverse(char*str)                第2次调用arr[]=bcdef\0  //理解为在对应地址上做变化,别的地址上的不变

{

int sz = strlen(str);

char tmp = *str;                   tmp=b; tmp为局部变量在此时和上次的tmp=a;不影响

*str = *(str + sz - 1);            arr[]=ecde\0\0  //理解为在对应地址上做变化,别的地址上的不变

*(str + sz - 1) = '\0';           arr[]=ecd\0\0\0  //理解为在对应地址上做变化,别的地址上的不变

if (strlen(str + 1) >= 2)

reverse(str + 1);           reverse(str + 1);递归二次

                                传入第三次次调用

*(str + sz - 1) = tmp;               arr[]=cd\0\0\0  //理解为在对应地址上做变化,别的地址上的不变

                                   *(str + sz - 1) = tmp; 先不执行

void reverse(char*str)                第3次调用arr[]=cd\0\0\0

{

int sz = strlen(str);

char tmp = *str;                   tmp=c; tmp为局部变量在此时和上次的tmp=b;不影响

*str = *(str + sz - 1);            arr[]=dd\0\0\0  //理解为在对应地址上做变化,别的地址上的不变

*(str + sz - 1) = '\0';           arr[]=d\0\0\0\0  //理解为在对应地址上做变化,别的地址上的不变

if (strlen(str + 1) >= 2)       不满足,不在调用

reverse(str + 1);          

*(str + sz - 1) = tmp;               arr[]=dc\0  //理解为在对应地址上做变化,别的地址上的不变

则 arr[]=fedcba;

void reverse(char*str)
{
  int sz = strlen(str);
  char tmp = *str;//首字符存入tmp
  *str = *(str + sz - 1);//最后面的字符存入数组的第一个位置
  *(str + sz - 1) = '\0';//数组最后位置放入\0
  if (strlen(str + 1) >= 2)//判断字符长度是否大于等于2
    reverse(str + 1);
  *(str + sz - 1) = tmp;//将tmp放入最后位置
}
int main()
{
  char arr[] = "abcdef";
  reverse(arr);
  printf("%s", arr);
}

2.倒置字符串__牛客网 (nowcoder.com)

该字符串倒置并非倒置为.gnij ekil i,思路:可以将整个字符串先倒置,然后再将每个单词倒置,

字符串倒置

定义两个指针变量,分别指向该字符串的头和字符串的尾,对两个指针指向的地址做循环判断,是否前面指针指向的地址小于后面指针指向的地址,循环里面交换两个指针所指向的字符,利用一个中间变量,然后前面的指针++;后面的指针减减;

在定义两个指针分别记录每个单词的起始地址和结束地址

char* cur = arr;//记录每个单词结束地址
  char* start = arr;//记录每个单词开始地址

start指向字符串数组的头,循环当cur没有指向空格时,cur++;循环结束,此时start指向字母的头,cur指向空格,此时调用

reverse(start, cur - 1);

将这个单词倒置,然后要倒置下一个单词,还是让start指向下一个单词的头,也就是cur指向的下一个字符,cur要加到下一个单词的尾,大循环是到*cur碰到\n;注意最后一个单词的结尾并不是空格,而是\0;

void reverse(char* l, char* r)//倒置函数
{
  while (l < r)
  {
    char tmp = *l;        
    *l = *r;
    *r = tmp;
    l++;
    r--;
  }
}
int main()
{
  char arr[100] = { 0 };
  gets(arr);   //scanf函数读不到空格或者用scanf("%[^\n]s,arr);
  int len = strlen(arr);
  char* left = arr;
  char* right = arr + len - 1;
  reverse(left, right);       //从这往上是将整个字符串倒置
  char* cur = arr;     //指向单词结尾的指针
  char* start = arr;    //指向单词头的指针
  while (*cur!='\0')     //指向单词结尾的指针不是最后一个单词结尾时循环
  {
    while (*cur !=' ' && *cur !='\0') //指向每个单词结尾的指针
    {
      cur++;
    }
    reverse(start, cur - 1);//倒置一个单词
    start = cur + 1;//指向下一个单词的首字母
    if(*cur!='\0')cur++;//指向单词结尾的指针移动到下一个空格
}
  printf("%s", arr);
}

倒置字符串的核心指针指向字符交换,并且移动指针,结束条件头指针地址小于尾指针,希望帮助到大家

目录
相关文章
|
9月前
|
索引
【LeetCode】917. 仅仅反转字母、387. 字符串中的第一个唯一字符
目录 917. 仅仅反转字母 387. 字符串中的第一个唯一字符
30 0
|
2月前
|
缓存 C语言
C语言 : 将一句话的单词进行倒置(逆序)
C语言 : 将一句话的单词进行倒置(逆序)
32 0
|
12月前
|
编译器 C语言
C语言:将一句话的单词进行倒置,标点不倒置。
总体思路: (可以把两步顺序调换) 第一步: 把 整个字符串 逆序 (知道 整个字符串 的首尾地址后,一对一对向整个字符串中间靠拢交换)
|
2月前
|
存储 编译器 C语言
Day2 排序子序列、倒置字符串
Day2 排序子序列、倒置字符串
32 0
|
8月前
|
算法 程序员
倒置字符串
倒置字符串
|
8月前
倒置字符串(倒置单词,标点不倒置)
倒置字符串(倒置单词,标点不倒置)
34 0
|
10月前
逆序一个字符串的每一组单词(不是倒叙)
整体思路: 1.先将整个字符串倒叙:i like china.->.anihc ekil i 2.将倒叙后的每一块单词再倒叙:.anihc->china. 想必大家都发现了,倒叙整个字符串和倒叙每一块是一样的,那么我们不妨写一个倒叙的函数在这里用reserve表示!
49 0
逆序字符串 和 字符串的逆序输出 的区别~
逆序字符串 和 字符串的逆序输出 的区别~
93 0
剑指offer 51. 字符串中第一个只出现一次的字符
剑指offer 51. 字符串中第一个只出现一次的字符
54 0
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词
每日三题 无重复字符的最长子串 最长连续序列 找到字符串中所有字母异位词
79 1
每日三题-无重复字符的最长子串、最长连续序列、找到字符串中所有字母异位词