【手把手带你刷LeetCode】——12.逆置字符串(非递归+递归)

举报
安然无虞 发表于 2022/05/27 23:32:48 2022/05/27
【摘要】 【前言】: 今天是力扣打卡第12天! 这道题目不是力扣上面的题目,之所以放到这里,是因为我感觉它很好,可以让我们加深对于递归的理解。 原题:逆置字符串 题目描述: 编写一个函数:reverse_string(char* string)(递归实现) 实现:将参数字符串中的字符反向排列,注意哦,不是逆序打印 要求:...

【前言】:

今天是力扣打卡第12天!

这道题目不是力扣上面的题目,之所以放到这里,是因为我感觉它很好,可以让我们加深对于递归的理解。

原题:逆置字符串

题目描述:

编写一个函数:reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,注意哦,不是逆序打印
要求:不能使用C语言库函数中的字符串操作函数

示例:


  
  1. //输入:abcdef
  2. //输出:fedcba

方法一:非递归解决

代码执行:


  
  1. #include<stdio.h>
  2. //方法一:非递归
  3. //自定义函数实现strlen()的功能
  4. int my_strlen(char* arr)
  5. {
  6. int len = 0;
  7. while (*arr != '\0')
  8. {
  9. len++;
  10. arr++;
  11. }
  12. return len;
  13. }
  14. //void reverse_string(char* arr)
  15. //{
  16. // //采用双指针的方式
  17. // int left = 0;
  18. // int right = my_strlen(arr) - 1;
  19. // //left == right 时,翻不翻转都无所谓
  20. // while (left < right)
  21. // {
  22. // char tmp = arr[left];
  23. // arr[left] = arr[right];
  24. // arr[right] = tmp;
  25. // left++;
  26. // right--;
  27. // }
  28. //}
  29. //上面实现采用的是数组下标的形式,这里不采用数组下标,采用指针解题
  30. void reverse_string(char* arr)
  31. {
  32. char* left = arr;//指针left指向数组首元素
  33. char* right = arr + my_strlen(arr) - 1;
  34. while (left < right)
  35. {
  36. char tmp = *left;
  37. *left = *right;
  38. *right = tmp;
  39. left++;
  40. right--;
  41. }
  42. }
  43. int main()
  44. {
  45. char arr[] = "abcdef";
  46. reverse_string(arr);
  47. printf("%s\n", arr);//fedcba
  48. return 0;
  49. }

利用非递归解决本题很简单,这道题目使用递归解决反而增加难度了,所以本题只是让大家对于递归有一个更深的认知。

复杂度分析:

时间复杂度:O(N)

空间复杂度:O(1)

方法二:递归解决

代码执行:


  
  1. 方法二:递归版本
  2. 说明:其实像这种逆置问题,用非递归解题是非常方便的,用递归反而复杂了
  3. 之所以用递归,是在练习递归的技巧
  4. reverse_string("abcdef")
  5. 拆化: f reverse_string("bcde") a
  6. 难点:将f和a交换一下,然后再逆序“bcde”,此时e后面放的是a,它根本就不知道什么时候结束,也就没办法将它看做一个字符串了
  7. 如何解决呢?
  8. 先把a拿出来,再将f放到原先a的位置,然后将原先g的位置放'\0',此时“bcde”就是一个字符串了,对其逆序,然后再将a拿上来放到最后
  9. #include<stdio.h>
  10. //自定义函数实现strlen()的功能
  11. int my_strlen(char* arr)
  12. {
  13. int len = 0;
  14. while (*arr != '\0')
  15. {
  16. len++;
  17. arr++;
  18. }
  19. return len;
  20. }
  21. void reverse_string(char* arr)
  22. {
  23. //找边界--字符串长度不大于1就不需要逆置了
  24. if (my_strlen(arr) <= 1)
  25. {
  26. return;
  27. }
  28. int len = my_strlen(arr);
  29. char tmp = *arr;//将a拿出来
  30. *arr = *(arr + len - 1);//将f放到a的位置
  31. *(arr + len - 1) = '\0';//将'\0'放到f的位置
  32. reverse_string(arr + 1);//逆置bcde
  33. *(arr + len - 1) = tmp;//最后将a放到最后
  34. }
  35. int main()
  36. {
  37. char arr[] = "abcdef";
  38. reverse_string(arr);
  39. printf("%s\n", arr);//fedcba
  40. return 0;
  41. }

复杂度分析:

时间复杂度:O(N)

空间复杂度:O(N)

上面只分析了第一层递归,实在不理解的小伙伴可以将递归展开图画出来,慢慢去感受本题。

结语

今天是力扣打卡第12天!

这些天都是痛并快乐着,每天都很充实,一起加油。

咱们明天再见! 

文章来源: bit-runout.blog.csdn.net,作者:安然无虞,版权归原作者所有,如需转载,请联系作者。

原文链接:bit-runout.blog.csdn.net/article/details/121257746

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。