题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
abcdef左旋一个字符得到bcdefa
abcdef左旋两个字符得到cdefab
题目分析:
对于这个问题,可以用很多种方法求解,这里介绍两种方法:
算法一:
左旋字符串的k个字符,我们可以先将剩下的n-k个字符移动最前面,然后将左旋的k个字符移动到字符串的最后面的位置,这就完成了字符串左旋k个字符的功能。其中,对于n-k个字符的移动,可以利用while循环,将后面的字符逐一进行拷贝。下面是具体的程序:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> void left_move(char *str, int num) { int i = 0; for (i = 0; i < num; i++) { char tmp = *str; int j = 0; while (*(str + 1 + j)) //将后面的字符移动到前面位置 { *(str + j) = *(str + 1 + j); j++; } *(str + j) = tmp; //将前面左旋的字符移动到后面 } } int main() { char arr[10] = "abcdef"; left_move(arr, 2); printf("输出左旋之后的字符串:\n"); printf("%s\n" , arr); system("pause"); return 0; }
算法二:
对于左旋字符串k个字符,可以将左旋的k个字符进行逆置,然后将剩下的n-k个字符进行逆置,最后,将整个字符串进行逆置,即就是:abcdef左旋两个字符,对ab进行逆置得到ba,对cdef进行逆置得到fedc,最后将整个字符串bafedc进行逆置得到cdefab,这就完成了题目要求。下面为具体的程序:
#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> char exchange( char *left, char *right ) { char *p = left; char tmp = 0; while(left != NULL && right != NULL && left < right) { tmp = *left; *left = *right; *right = tmp; left++; right--; } } char *left(char *arr, int num) { int len = strlen(arr); exchange(arr, arr + (num - 1)); exchange(arr + num, arr + (len - 1)); exchange(arr, arr + (len - 1)); return arr; } int main() { char arr[] = "abcdef"; puts(left(arr, 2)); system("pause"); return 0; }
注:对于判断两个字符串中,其中一个字符串为另一个字符串左旋或右旋后的字符串的问题,见下篇博客:
本文出自 “无心的执着” 博客,转载请与作者联系!
原文地址:http://10740590.blog.51cto.com/10730590/1709706