字符串逆序(递归和循环)

简介: 字符串逆序(递归和循环)

题目:编写一个函数 reverse_string(char * string)


实现:将参数字符串中的字符反向排列,不是逆序打印。


要求:不能使用C函数库中的字符串操作函数。


比如:   char arr[] = "abcdef";


逆序之后数组的内容变成:fedcba


题目分析:


字符串逆序,用循环来做很简单,只需要定义两个指针,指针left放在字符串左侧,right放在最后一个有效字符位置,再交换两个指针位置上的字符,left指针往后走,right指针往前走只要两个指针没有相遇,继续交换,两个指针相遇后,逆置结束;用递归实现就相对麻烦一点,当每次传递参数的时候只有刚开始字符串中的那一个\0,在每次递归前,必须手动加上\0,才能继续用strlen计算递归传递过去的字符串长度,这一点是很难想到的。


//循环实现

#include<stdio.h>
#include<string.h>
void reverse_string(char*string)
{
  char *left = string;
  char *right = string+strlen(string) - 1;
  while (right - left > 0)
  {
    int tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
  }
}
int main()
{
  char arr[] = "abcdef";
  reverse_string(arr);
  puts(arr);
  return 0;
}

代码讲解:指针right-指针left得到的是left与right之间的元素个数,那么在编程序的时候,只需要控制left与right之间有元素的时候就交换,没有元素的时候就停止循环,交换完成。strlen函数是从传递给strlen的函数参数的地址开始一直往后找,每找到一个字符,就计数加1,知道遇见字符‘\0’为止,用于求字符串长度。


//递归实现

#include<stdio.h>
#include<string.h>
void reverse_string(char* string)
{
  int len = strlen(string);
  char tmp = *string;
  *string = *(string + len - 1);
  *(string + len - 1) = '\0';
  if (strlen(string + 1) >= 2)
    reverse_string(string+ 1);
  *(string + len - 1) = tmp;
}
int main()
{
  char arr[] = "abcdef";
  reverse_string(arr);
  puts(arr);
  return 0;
}

代码讲解:当第一次进入函数后,先将最后一个字符放在第一个字符的位置,但是不急着交换,将本该放在字符串末尾的第一个字符存起来,然后将字符串末尾置为'\0',计算从第二个字符开始,字符串的长度,如果大于1个的话,就进入递归,再重复上面的过程,递归结束后,再将存起来的字符放在交换后应该在的位置即可


总结:循环和递归还是应该尽量选择简单的,即可代码写出来,它的可读性和时间复杂度也是很重要的

相关文章
|
2月前
|
机器学习/深度学习 C语言
函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数
函数递归与迭代附n的阶乘+顺序打印一个整数的每一位数+求第n个斐波那契数
28 0
|
2月前
|
算法 C语言
C语言汉诺塔数列(循环版,递归版)
C语言汉诺塔数列(循环版,递归版)
48 0
|
12月前
|
算法
【算法】用递归的方法逆序输出或倒置一个栈
【算法】用递归的方法逆序输出或倒置一个栈
104 0
【算法】用递归的方法逆序输出或倒置一个栈
|
机器学习/深度学习 算法
使用递归方法和for循环方法求阶乘
使用递归方法和for循环方法求阶乘
125 0
字符串的逆序(循环和递归两种解法)
字符串的逆序(循环和递归两种解法)
98 0
剑指offer_递归与循环---斐波那契数列
剑指offer_递归与循环---斐波那契数列
50 0
|
机器学习/深度学习
求n的阶乘(递归法和循环法
根据阶乘的计算方法:n!= 1 * 2 * 3*…*n,我们在一个for循环完成 n 次乘法运算。注意因为是连乘,最终阶乘结果可能会非常大所以我们在Fac函数中用 long long 类型的变量来记录阶乘的结果。
|
机器学习/深度学习 算法 C语言
函数递归+青蛙跳台阶——“C”
函数递归+青蛙跳台阶——“C”
你是真的“C”——函数递归详解青蛙跳台阶
手把手教学——函数递归详解汉诺塔+青蛙跳台阶问题
88 0
你是真的“C”——函数递归详解青蛙跳台阶