我们经常会碰到旋转字符串的题目,例如将”abcdef”旋转成”defabc”,或者输入”I am a student”,输出”student. a am I”,请写一个函数实现此功能.
我们先用”abcdef”翻转为”defabc”来分析
解法一:暴力求解 就是将要翻转的字符一个个移到字符串的尾部。 代码如下: #include <stdio.h> void LeftShiftOne(char str[], int size) { char ch = str[0]; for (int i = 1; i < size; ++i) { str[i - 1] = str[i]; } str[size - 1] = ch; } void LeftRotateString(char str[], int size, int m) { //每次只挪一个字符需要移动m次 while (m--) { LeftShiftOne(str, size); } } int main() { char str[] = "abcdef"; int size = sizeof(str)/sizeof(str[0])-1; int n = 3; LeftRotateString(str, size, n); return 0; } 解法二:三步翻转 我们将一个字符串分割成两部分,然后将这两个部分都进行翻转,最后对这个字符串整体进行翻转。 例如: 将”abcdef”分为”abc”和”def”然后对两部分进行翻转成为”cba”和”fed”,整体变成”cbafed”再将”cbafed”进行翻转,成为”defabc” 代码如下: #include <stdio.h> void ReverseString(char str[], int from, int to) { while (from < to) { char ch = str[from]; str[from++] = str[to]; str[to--] = ch; } } void LeftRotateString(char str[], int size, int n) { n = n % size; ReverseString(str, 0, n - 1); ReverseString(str, n, size-1); ReverseString(str, 0, size-1); } int main() { char str[] = "abcdef"; int size = sizeof(str)/sizeof(str[0])-1; int n = 3; LeftRotateString(str, size, n); return 0; }输入”I am a student.”,输出”student. a am I”,请写一个函数实现此功能.
分析 首先明确我们对这个字符串整体翻转是达不到效果的,只能讲一个整单词往后边移,这样不好实现。因此,我们将每个单词先翻转,即除了最后一个单词外,空格之前即为一个单词。翻转完成后变为”I ma a .tneduts”,然后在将其整体翻转即成为”student. a am I”。代码实现 #include <stdio.h> //先将每个单词翻转,然后在总体翻转 void ReverseShiftOne(char str[], int from, int to) { while(from < to) { char ch = str[from]; str[from++] = str[to]; str[to--] = ch; } } void ReverseRotateStr(char str[], int size) { int m = 0; int n = 0; while (str[n]) { //等于空格,则将该空格前边的字符翻转 if(str[n+1] == ' ') { ReverseShiftOne(str, m, n); m = n + 2; } n++; } ReverseShiftOne(str, m, n-1); } int main() { char str[] = "I am a student."; int size = sizeof(str) / sizeof(str[0])-1; ReverseRotateStr(str, size); ReverseShiftOne(str, 0, size - 1); return 0; }