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

该题的要求是实现一个函数,它的功能是将一个字符串向左旋转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. java 1 11 111_45675678ystem111111111111
  2. CompletableFuture CompletableFuture.supplyAsync 异常处理
  3. python plot设置坐标轴_python matplotlib坐标轴设置的方法
  4. V-rep学习笔记:机器人模型创建4—定义模型
  5. ISelectionSet接口
  6. Ubuntu vi文本编辑器
  7. tensorflow基础练习:线性模型
  8. BZOJ-3171-循环格-TJOI2013-费用流
  9. 数据下载工作笔记三:脚本
  10. SQL Server 分离与附加数据库
  11. IBM 重磅开源 Power 芯片指令集!国产芯迎来新机遇?
  12. 北京远卓科技有限责任公司2017笔试题
  13. 亲身经历,大龄程序员,为什么难找对象!
  14. java 根据手机号获取归属地
  15. Windows主机连接Windows虚拟机上Oracle数据库
  16. 【perl计算基因在基因组上的距离】
  17. 已有一个排好序的数组,今输入一个数,要求按原来排序的规律将它插入数组中
  18. Lumerical Mode FDE 碰到的错误整理【整理中】
  19. Unity Shader学习记录(18) —— Shader动画
  20. Ac4GlcNAz,98924-81-3,N-乙酰葡糖胺叠氮基,可以进行糖化学修饰

热门文章

  1. win10添加软件开机启动
  2. 终结DbHelper鬼画符2 Tdd全攻略
  3. Flink 本地安装 构建Flink应用
  4. STL容器之<vector>
  5. 10-6 查询选修了所有3学分课程的学生学号
  6. nprogress进度条的使用
  7. NProgress 进度条
  8. 十点半前上床睡眠最好,健康有保障! - 生活至上,美容至尚!
  9. 计算机科学计算课后题答案,计算机系统习题及答案.doc
  10. 使用jks文件为apk签名