1.实现一个函数,可以左旋字符串中的k个字符。
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
#include<stdio.h>
void flip(char* str, int k, int num){
for (int i = 0; i < k; i++){
char first = *str;
for (int j = 0; j < num - 1; j++){
*(str + j) = *(str + j + 1);
//交换两字符还可以用异或的方法
//*left = *left^*right;
//*right = *left^*right;
//*left = *left^*right;
}
*(str + num - 1) = first;
}
}
int main(void){
char str[] = "ABCD";
int k = 2;
int num = 0;
num=sizeof(str) / sizeof(str[0]);
flip(str,k,num-1);//c风格字符串有一个\0结尾,故num-1
int i = 0;
for (i = 0; i < 4; i++){
printf("%c", str[i]);
}
return 0;
}
2.判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1,给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int flip(char* arr, char* arr1, int k, int n,int count){
char* first;
int i;
while (count){
if (n == 1){
char first = *arr;
for (i = 0; i < k; i++){
arr[i] = arr[i + 1];
}
arr[k - 1] = first;
}
if (n == 2){
char* first = arr + k - 1;
for (i = 0; i < k; i++){
arr[i + 1] = arr[i];
}
arr[0] = *first;
}
count--;
}
return strcmp(arr, arr1);
}
int main(void){
char arr[] = "ABCDEF";
char arr1[] = "CDEFAB";
int k = 0;
int text = 0;
int count = 2;
int xuan = 0;
k = sizeof(arr) / sizeof(arr[0]);
printf("请选择需要进行的翻转方式,输入1是左旋,输入2是右旋\n");
scanf("%d", &xuan);
printf("要旋转几个字符\n");
scanf("%d", &count);
text=flip(arr, arr1, k - 1, xuan, count);//c风格字符串多一个\0
if (text == 0){
printf("两个字符串一样\n");
}
if (text > 0){
printf("不一样\n");
}
if (text < 0){
printf("不一样\n");
}
return 0;
}