各位大佬,今天我要介绍的是字符串旋转的解法。

该题的要求是实现一个函数,它的功能是将一个字符串向左旋转k个字节,例如:

ABCD左旋一个字符得到BCDA

ABCD左旋两个字符得到CDAB

它的大概思路是这样的:我们可以先将第一个要旋转的字符取出放入一个临时变量tmp中,然后让后面的字符覆盖上来,再将最后一个位置放入我们最先取出的字符。

思路很简单,那么如何用代码来实现呢?

#include<stdio.h>
#include<string.h>
void turn_left(char arr[],int k)
{int len = strlen(arr);for(int i = 0;i<k;i++){char tmp = arr[0];for(int j = 0;j<len-1;j++){arr[j] = arr[j + 1];}arr[len - 1] = tmp;}
}int main()
{char arr[] = "abcdefgh";int k = 0;scanf("%d", &k);turn_left(arr, k);printf("%s", arr);return 0;}

在函数功能部分先计算出该字符串的长度,然后是for循环的嵌套。在for循环内部先将数组首元素取出赋予一个临时量tmp,外层循环是移动几个字符就循环几次,里面的是将所有字符向前移动一位。

这种方法相对简单,那么有没有更加巧妙的方法呢?答案是有的。

我们可以利用字符串倒序来达到我们的目的。

就像“abcdefghi”这样的字符串,我们假设让两个字符向左旋转。首先我们可以将这段字符串看成“ab”和“cdefghi”两部分,再让这两部分倒序“baihgfedc”最后将整个字符串逆序就成了“cdefgiab”

接下来就使用代码来实现他。

void Reverse2(char* left,char* right)
{assert(left && right);while(left < right){char tmp = *left;*left = *right;*right = tmp;left++;right--;}
}
void turn_left(char arr[], int k)
{int len = strlen(arr);Reverse2(arr, arr + k - 1);Reverse2(arr+k, arr + len - 1);Reverse2(arr, arr + len - 1);}
int main()
{char arr[] = "abcdefgh";int k = 0;scanf("%d", &k);turn_left(arr, k);printf("%s", arr);return 0;}

当k = 2时,第一个Reverse是将ab逆序,第二个Reverse是将除“ab”以外的部分逆序,最后一个Reverse逆序。

这样也能达到我们的目的。

关于字符传旋转还有一个类似的变式题。

他的要求是:写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。

例如:给定s1 =AABCD和s2 = BCDAA,返回1

给定s1=abcd和s2=ACBD,返回0.

AABCD左旋一个字符得到ABCDA

AABCD左旋两个字符得到BCDAA

AABCD右旋一个字符得到DAABC

这题我们利用字符串旋转的第一种方法再加入if语句即可解决。

Chack_turn_left(char arr1[],char arr2[])
{int len = strlen(arr1);for (int i = 0; i < len; i++){char tmp = arr1[0];for (int j = 0; j < len - 1; j++){arr1[j] = arr1[j + 1];}arr1[len - 1] = tmp;if (strcmp(arr1, arr2) == 0){return 1;}}return 0;
}
int main()
{char arr1[] = "abcdefgh";char arr2[] = "cdefghab";int ret = Chack_turn_left(arr1,arr2);if (ret == 1){printf("Yes");}elseprintf("No");return 0;
}

当然,每一道编程题都不止一种解法。

我们可以利用字符串函数来解决,首先我们先用strcat在arr1后面追加一个与他相同的字符串,这样所有的旋转结果我们都可以在arr1中找到。然后我们可以去判断arr2是不是arr1的字串。从而达到目的。因为arr1是arr2旋转得到的,所以在arr1没有使用strcat追加之前两字符串的长度应该是相同的。

实现代码如下:

int Chack_turn_left2(char arr1[],char arr2[])
{int len1 = strlen(arr1);int len2 = strlen(arr2);if(len1 != len2){return 0;}strncat(arr1, arr1, len1 - 1);char* ret = strstr(arr1, arr2);if (ret == NULL){return 0;}elsereturn 1;
}
int main()
{char arr1[50] = "abcdefg";char arr2[] = "cdefgab";int ret = Chack_turn_left2(arr1, arr2);if (ret == 1){printf("Yes");}elseprintf("No");return 0;
}

今天的分享就到这里,下篇博客见!!!

字符串向左旋转的解法(c语言)相关推荐

  1. 数据结构——算法之(010)( 字符串的左旋转操作)

    [申明:本文仅限于自我归纳总结和相互交流,有纰漏还望各位指出. 联系邮箱:Mr_chenping@163.com] 题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串 ...

  2. 182-将字符串向左旋转N个位置

    题目如下: 给定一个字符串S和一个数字N,将字符串向左旋转N个位置,然后输出 示例: 将字符串S="hellolinzeyu";向左旋转5个位置 输出:"linzeyuh ...

  3. 程序员编程艺术(算法卷):第一章、左旋转字符串

    第一章.左旋转字符串 作者:July,yansha. 时间:二零一一年四月十四日. 说明:(狂想曲,有三层意思:1.思绪纷飞,行文杂乱无章,想到什么,记下什么.2.简单问题深入化,复杂问题精细化,不惧 ...

  4. 剑指 Offer 笔记: T58 - II. 左旋转字符串

    T58 - II. 左旋转字符串 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字 ...

  5. LeetCode 03: T58. 最后一个单词的长度(简单); 剑指 Offer 05. 替换空格(简单); 剑指 Offer 58 - II. 左旋转字符串(简单)

    文章目录 T7: 58. 最后一个单词的长度(简单) 思路 解法: 双指针 T8: 剑指 Offer 05. 替换空格(简单) 思路 解法: replace T9: 剑指 Offer 58 - II. ...

  6. 代码随想录算法训练营第八天|344.反转字符串 541. 反转字符串II 剑指Offer 05.替换空格 151.翻转字符串里的单词 剑指Offer58-II.左旋转字符串

    一.344.反转字符串 题目:编写一个函数,其作用是将输入的字符串反转过来.输入字符串以字符数组 char[] 的形式给出. 不要给另外的数组分配额外的空间,你必须原地修改输入数组.使用 O(1) 的 ...

  7. 【编程题目】左旋转字符串 ☆

    26.左旋转字符串(字符串) 题目: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部. 如把字符串 abcdef 左旋转 2 位得到字符串 cdefab.请实现字符串左旋转的函数. ...

  8. 翻转单词顺序与左旋转字符串

    题目一:输入一个英文句子,翻转句子中单词的顺序.但是单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.例如输入字符串"I am a student.",则输出" ...

  9. C#实现字符串左旋转操作

    竞赛题目及要求: 定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部.如把字符串abcdef左旋转2位得到字符串cdefab. 要求:对长度为n的字符串操作的时间复杂度为O(n),空间 ...

最新文章

  1. 【Leetcode】376. Wiggle Subsequence
  2. 概率论与数理统计(三)
  3. 【arduino】DIY音乐播放器,arduino播放wav音乐,TRMpcm库测试及使用
  4. 2021-01-07 matlab数值分析 数值积分与数值微分 复合梯形公式 复合Simpson公式
  5. boost::safe_numerics::base_type相关的测试程序
  6. 小腿训练三部曲之(三)
  7. 实例构造器和类(引用类型)
  8. vlookup练习_大胆合并吧!VLOOKUP坐字法专做单元格合并查找
  9. 关于html标签元素的data-*属性
  10. ubuntu学习笔记之安装oracle客户端
  11. python安装pandas失败_详解pandas安装若干异常及解决方案总结
  12. html背景图片显示不出,css中背景图片显示不出来
  13. 机器学习:混淆矩阵、准确率、错误率、灵敏度、特异度、精准率、召回率、F-Measure、ROC曲线 PR曲线
  14. Rob Knight: PCR不需要做三个平行再混合!
  15. pcm设备的注册流程
  16. Android计算器LinearLayout实现布局
  17. 微博平台的RPC服务化实践
  18. 【codeforces 417D】Cunning Gena
  19. 全球 26 个主流视频网站高清视频下载全搞定,包括 P 站!
  20. 寂寞约会吧客服务器的微信是多少钱,约会专家倪淙岩:72招教你如何微信撩妹...

热门文章

  1. RecalcLayout
  2. 项目实训-智能创新引导工具(5):创新引导相关接口
  3. 定义Boat与car两个类,二者都有weight属性,定义二者的一个友元函数gettotalweight(),计算二者的重量和。
  4. [APK签名] apksigner APK V2签名
  5. 图片上传并且支持预览
  6. CIO的BI选型思路篇
  7. AddressSanitizer原理解析
  8. HTML怎么设置动画速度,animate帧速率在哪调? animate修改帧速率的技巧
  9. R语言实现EMD分析
  10. iOS开发的知名个人博客及几个网站