剑指offer之左旋转字符串

举报
chenyu 发表于 2021/07/26 23:26:39 2021/07/26
【摘要】 1 题目 字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab               2 思路 先反转字符串所有,通过数字n找到的边界 ,然后再反转字符串部分左边和部分右边。   &nbs...

1 题目

字符串的左旋转操作是把字符串前面的若干字符转移到字符串尾部,比如字符串abcdef和数字2,函数返回左旋转得到的结果是cdefgab

 

 

 

 

 

 

 

2 思路

先反转字符串所有,通过数字n找到的边界 ,然后再反转字符串部分左边和部分右边。

 

 

 

 

 

 

 

3 代码实现


  
  1. #include <stdio.h>
  2. /*
  3. * 反转整个字符串
  4. */
  5. void reverse(char *begin, char *end)
  6. {
  7. if (NULL == begin || NULL == end)
  8. return;
  9. while (begin < end)
  10. {
  11. char temp = *end;
  12. *end = *begin;
  13. *begin = temp;
  14. ++begin;
  15. --end;
  16. }
  17. }
  18. /*
  19. * 左旋转字符串
  20. * abcdefg
  21. * gfedcba
  22. * cdefgab
  23. */
  24. char* leftReverse(char *str, int n)
  25. {
  26. if (str == NULL || n < 0)
  27. {
  28. return NULL;
  29. }
  30. //先反转所有字符串
  31. char *begin = str;
  32. char *end = str;
  33. int len = 0, count = n;
  34. while (*end != '\0')
  35. {
  36. ++end;
  37. ++len;
  38. }
  39. if (n > len)
  40. {
  41. return NULL;
  42. }
  43. end--;
  44. reverse(begin, end);
  45. begin = str;
  46. //移动end到左右反转分界地方
  47. while (n > 0)
  48. {
  49. --n;
  50. --end;
  51. }
  52. //反转左边一部分
  53. reverse(begin, end);
  54. //反转右边一部分
  55. reverse(end + 1, end + count);
  56. return str;
  57. }
  58. int main()
  59. {
  60. char b[] = "abcdefg";
  61. char *result = NULL;
  62. result = leftReverse(b, 2);
  63. printf("%s\n", result);
  64. return 0;
  65. }

 

 

 

 

4 运行结果

cdefgab
 

 

文章来源: chenyu.blog.csdn.net,作者:chen.yu,版权归原作者所有,如需转载,请联系作者。

原文链接:chenyu.blog.csdn.net/article/details/98671136

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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