题目要求:
字符串左旋
实现一个函数,可以左旋字符中的K个字符
例如:
ABCD左旋一个字符变成BCDA
ABCD左旋两个字符变成CDAB
方法1:
实现思路:
#include<string.h>
#include<stdio.h>
void left_move(char *str, int k){
int i = 0;
int len = strlen(str);//求字符串长度
for (i = 0; i < k; i++){
int j = 0;
char tmp = *str;//第一个元素暂存
for (j = 0; j < len - 1; j++){
*(str+j) = *(str+j+1);//依次向前挪动
}
*(str+len-1)= tmp;//暂存的元素,送到最后一位
}
}
int main(){
char arr[10] = "ABCDEF";
int k = 0;
printf("请输入左旋几次:\n");
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
方法二:
实现代码:
void reverse(char* left, char* right){//逆序函数
while (left < right){
int tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
void left_move(char *str, int k){
int len=strlen(str);
reverse(str, str + k - 1);//左
reverse(str + k, str + len - 1);//右
reverse(str, str + len - 1);//全部
}
int main(){
char arr[10] = "ABCDEF";
int k = 0;
printf("请输入左旋几次:\n");
scanf("%d", &k);
left_move(arr, k);
printf("%s\n", arr);
return 0;
}
实现原理:
本题完结
请看和此题相关的题目:字符串旋转结果
要求:写一个函数判断一个字符串是否是另一个字符串旋转后得到的
例如:ABCDE与EDCBA这俩个显然是
abcd与ABCD 这显然不是
int judge_string(char* str1, char* str2){
int i = 0;
int len = strlen(str1);//求字符串长度
for (i = 0; i < len; i++){
int j = 0;
char tmp = *str1;//第一个元素暂存
for (j = 0; j < len - 1; j++){
*(str1+j) = *(str1+j+1);//依次向前挪动
}
*(str1+len-1)= tmp;//暂存的元素,送到最后一位
if (strcmp(str1, str2) == 0){
return 1;
}
}
return 0;
}
int main(){
char arr1[10] = "ABCDEF";
char arr2[10] = "CDEFAB";
int ret=judge_string(arr1, arr2);//返回1 说明是,返回0 不是
if (ret == 1){
printf("yes");
}
else printf("no");
return 0;
}
实现思想:
方法2:
我们先看一下实现的思路:
知道了这个思路我们就可以,用库函数实现了
先看代码:
#include<stdio.h>
#include<string.h>
int left_move(char* str1, char* str2){
if (strlen(str1) != strlen(str2)){//这两个字符串不相等。直接接返回0
return 0;
}
strncat(str1, str2, 5);//n的意思就是多一个参数
char* p=strstr(str1, str2);//比较后一个参数是不是第一个的子串,是就返回子串开始字母的地址,不是就返回空指针
return p != NULL;
}
int main(){
char arr1[20] = "AABCD";
char arr2[] = "BCDAA";
int ret=left_move(arr1, arr2);
if (ret == 1){
printf("yes");
}
else printf("no");
return 0;
}
解释: