目录
1. 字符串的左旋
2. 判断一个字符串是否为另外一个字符串旋转之后的字符串
1. 字符串的左旋
题目:
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
 

#include<stdio.h>
#include<string.h>
//第一个方法:暴力旋转,也就是枚举。
//a是传进来的数组首元素地址,k是要左旋的个数
void leftMoveStrOne(char* a, int k) {
	//先计算该数组有多长
	size_t len = strlen(a);
	//如果k是大于len,说明k旋转了一周或者n周,所以要取模
	k = k % len;
	for (int i = 0;i < k;i++) {
		//将第一个数组元素保存起来
		int tmp = a[0];
		size_t j = 0;
		//这里为什么需要len - 1呢,因为怕越界了
		//例如:有5个元素,下标最多到4,而j + 1可能会到5,所以越界了!
		for (j = 0;j < len - 1;j++) {
			a[j] = a[j + 1];
		}
		a[len - 1] = tmp;
	}
}
int main() {
	char str[]= "ABCDE";
	leftMoveArrOne(str, 2);
	printf("%s", str);
	return 0;
	/*char str[]= "ABCDE";
	leftMoveStrTow(str, 2);
	printf("%s", str);*/
	return 0;
} 
运行结果如下:

- 第二种:三步翻转法,也叫三步逆序法。
 

//第二种方法:三步翻转法,也叫三步逆序法。
//先写一个逆序的方法
void reverse(char* left, char* right) {
	while (left < right) {
		char tmp = *left;
		*left = *right;
		*right = tmp;
		left++;
		right--;
	}
}
void leftMoveStrTow(char* str, int k) {
	size_t len = strlen(str);
	k = k % len;
	reverse(str, str + k - 1);//第一次翻转
	reverse(str + k, str + len - 1);//第二次翻转
	reverse(str, str + len - 1);//第三次翻转
}
int main() {
	char str[]= "ABCDE";
	leftMoveStrTow(str, 2);
	printf("%s", str);
	return 0;
} 
运行结果如下:

2. 判断一个字符串是否为另外一个字符串旋转之后的字符串
题目:
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.
AABCD左旋一个字符得到ABCDA
AABCD左旋两个字符得到BCDAA
AABCD右旋一个字符得到DAABC
解析:该题有两种解决方法(我能想到的)。
- 第一种:直接暴力解法
 
不断地左旋,得到一个新的字符,然后去判断两个字符串是不是相等!
//第一种方法:暴力破解法,枚举
//s1是要匹配的字符串,s2是去匹配s1的字符串
int isLeftMove(char* s1, char* s2) {
	size_t lens1 = strlen(s1);
	size_t lens2 = strlen(s2);
	if (lens1 != lens2) {
		return 0;
	}
	size_t i = 0;
	for (i = 0;i < lens1;i++) {
		char tmp = s2[0];
		size_t j = 0;
		for (j = 0;j < lens1 - 1;j++) {
			s2[j] = s2[j + 1];
		}
		s2[lens1 - 1] = tmp;
		if (strcmp(s1, s2) == 0) {
			return 1;
		}
	}
	return 0;
}
int main() {
	char s1[20] = "abcde";
	char s2[] = "bcdea";
	int flag = isLeftMove(s1, s2);
	printf("%d", flag);
	return 0;
} 
运行结果如下:

- 第二种:拼接比较法
 

//第二种方法:拼接比较法
int isLeftMovePlus(char* s1, char* s2) {
	size_t lens1 = strlen(s1);
	size_t lens2 = strlen(s2);
	if (lens1 != lens2)
		return 0;
	char* start = strncat(s1, s1, lens1);
	//用strstr()函数判断s2是不是s1的子串
	if (strstr(start, s2) == NULL)
		return 0;
	else
		return 1;
}
int main() {
	char s1[20] = "abcde";
	char s2[] = "bcdea";
	int flag = isLeftMove(s1, s2);
	printf("%d", flag);
	return 0;
}
 
运行结果如下:








![[Machine Learning][Part 5]监督学习——逻辑回归](https://img-blog.csdnimg.cn/7ab3e1a6851946818d6bdb2d0f11268b.png)











