实现一个函数,可以左旋字符串中的k个字符。
例如:ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB.
实现字符串的左旋即将字符串的字谜放在字符串的后面,然后在将字符串向前挪。
其实要实现该功能,实现方法很多,我这里写两种。
方法一:将要左旋的字母个数n通过键盘输入得到。根据个数取字符串前n个字母,将其放在一个数组里,然后将字符串后面的字符向前挪,之后将数组里面的内容放在字符串的后面即可完成。
下面看一下这个方法的代码:
内容其实很简单,关键要将变量分清,并且要用指针对字符串的内容进行操作。
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
void Rotate(char *p, int num,int s){
int i = 0;
char set[10] = { ' ' };
for (; i < num; i++){
set[i] = *(p + i);
}
for (i = 0; i < s-num; i++){//剩下的元素
*(p + i) = *(p + num+ i);//一定是加上要被左旋字母的个数
}
int j = 0;
for (i = s-num ; i < s; i++){//多个变量时,分清变量
*(p + i) = set[j];
j++;
}
}
int main(){
char str[] = { 'A', 'B', 'C', 'D', 'E' };
int sum = sizeof(str) / (sizeof(str[0]));
int n = 0;
for (int i = 0; i < sum; i++){
printf("%c ", str[i]);
}printf("\n");
printf("你想要左旋多少个字符?\n");
scanf("%d", &n);
Rotate(str, n,sum);
for (int i = 0; i < sum; i++){
printf("%c ", str[i]);
}
system("pause");
return 0;
}
方法二:我们通过不断的变换,可以发现左旋一个字母时,可以将第一个字母拿出来,然后将后面的字母向前挪,然后把字母放在最后一个位置。当要左旋两个字母时,在上面的基础上再操作一次,即可实现。这样就的带规律只用写一个循环,然后次数在写一个循环,即可。
以下即使实现:
#include<stdio.h>
#include<Windows.h>
#pragma warning(disable:4996)
void rotate(char *p,int s,int n){
int i = 0,j=0;
for (; j < n; j++){
char a = *(p + 0);
for( i=1; i < s; i++){
*(p + i - 1) = *(p + i);
}*(p + i - 1) = a;
}
}
int main(){
char arr[] = { 'A', 'A', 'B', 'C', 'D' };
int num = 0;
int size = sizeof(arr) / sizeof(arr[0]);
scanf("%d", &num);
rotate(arr,size,num);
for (int i = 0; i < size; i++){
printf("%c ", arr[i]);
}
system("pause");
return 0;
}
这里还有另外两种做法:
方法三:使用双字符串实现,即将该字符串赋值为双串,然后通过选择要左旋的字母的个数,将该双串从相应位置向后截取原字符串长度。下面画个图举例:
这样就可以完成任意数字的左旋。下面展示一下核心代码:
char * rotate(char *s,char *s1,int n,int l){
int i = 0;
while (i<l){
*(s1+i)= *(s + n+i);
i++;
}*(s1 + i) = '\0';
return s1;
}
int main(){
char str[N] = "ABCDEF";
char str1[N];
int len = strlen(str);
int n = 0;
printf("请输入要左旋的个数:\n");
scanf("%d", &n);
strcat(str, "ABCDEF");
printf("%s\n",rotate(str,str1, n%len, len));
system("pause");
return 0;
}
方法四:可以通过对指定下标的字母进行逆序,就可实现。(可需要多次的观察实践)。
下面还是用途解释一下:
如上图,可以经过三次逆置,即可实想要的左旋字符串。
下面是核心代码:
void reverse(char *a,int s,int e){
while (s < e){
*(a + s) ^=*(a + e);
*(a + e) ^= *(a + s);
*(a + s) ^= *(a + e);
s++; e--;
}
}
int main(){
int n = 0;
char str[] = "ABCDEF";
int len = strlen(str);
printf("你想要左旋多少个字母:\n");
scanf("%d", &n);
reverse(str,0, n%len - 1);
reverse(str,n%len, len - 1);
reverse(str,0, len - 1);
printf("%s\n", str);
system("pause");
return 0;
}
里面^=是按位异或的操作,具体,可以参考我以前的博客。
如果大家还有更简单的方法,欢迎指点哦。