字符串左旋问题

Posted 一朵花花

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字符串左旋问题相关的知识,希望对你有一定的参考价值。

题目1

字符串左旋
实现一个函数,可以左旋字符串中的k个字符。
例如:
ABCD左旋一个字符得到BCDA
ABCD左旋两个字符得到CDAB

思路分析
创建一个临时变量用来存放字符串的第一个字符,利用for循环遍历字符串,实现将后一位赋值给前一位,最后将第一个字符赋值给最后一个元素即可。
在这里插入图片描述

代码实现

//实现一个函数,可以左旋字符串中的k个字符。
void leftturn(char* str,int length,int k) {
	//循环实现 字符左旋
	for (int i = 0; i < k; i++) {
		int n = 0;
		//使用临时变量储存第一个字符
		char tmp = str[0];
		//遍历数组,实现将后一位赋值给前一位
		for (int n = 0; n < length - 1; n++) {
			str[n] = str[n + 1];
		}
		//实现第一字符赋值给最后一个元素
		str[length-1] = tmp;
	}
}
int main() {
	char str[] = "abcd";
	int length = strlen(str);
	int k = 0;
	printf("请输入左旋字符的个数:");
	scanf("%d", &k);
	printf("before:%s\\n", str);
	leftturn(str,length,k);
	printf("after:%s\\n", str);
	system("pause");
	return 0;
}

代码过程分析
在这里插入图片描述

题目2

字符串旋转结果
写一个函数,判断一个字符串是否为另外一个字符串旋转之后的字符串。
例如:
给定s1 =AABCD和s2 = BCDAA,返回1
给定s1=abcd和s2=ACBD,返回0.

思路分析

这道题在上一道题的基础上,增加了字符串旋转结果的判断,可以创建一个判定函数Judge,循环调用左旋和右旋函数,来判定每次循环结果的字符串是不是和str相等,若是我们要找的find,则返回1即可~

代码实现

//左旋k个字符函数
void leftTurn(char* str,int length,int k) {
	for (int i = 0; i < k; i++) {
		int n = 0;
		char tmp = str[0];
		for (int n = 0; n < length - 1; n++) {
			str[n] = str[n + 1];
		}
		str[length-1] = tmp;
	}
}
 //右旋k个字符函数
void rightTurn(char* str, int length, int k) {
	for (int i = 0; i < k; i++) {
		int n = 0;
		char tmp = str[0];
		for (int n = 0; n < length - 1; n++) {
			str[n] = str[n + 1];
		}
		str[length - 1] = tmp;
	}
}
//比较 两字符串是否符合要求
int judge(char* str, char* find) {
	int length1 = strlen(str);
	int length2 = strlen(find);
	//两个字符串长度不同,直接返回0
	if (length1 != length2) {
		return 0;
	}
	//使用循环 调用 左旋右旋函数,得到每一次变化的结果
	for (int i = 0; i < length1; i++) {
		leftTurn(str, length1, i);
		if (strcmp(str, find) == 0) {
			return 1;
		}
		rightTurn(str, length1, i++);
		if (strcmp(str, find) == 0) {
				return 1;
		}
	}
	return 0;
}
int main() {
	char s1[] = "AABDC";
	char s2[] = "BCDAA";
	printf("%s\\n%s\\n", s1, s2);
	int ret=judge(s1, s2);
	printf("%d\\n", ret);
	system("pause");
	return 0;
}

补充说明

调用strcmp函数,需要包含头文件<string.h>
strcmp函数的原型是:int strcmp(const char * str1,const char * str2)
strcmp是比较两个字符串是否相等,此函数开始比较每个字符串的第一个字符。如果它们彼此相等,则继续往下比对,直到字符不同或到达终止的空字符为止

返回值表示
<0第一个不匹配的字符在str1中的值比在str2中的值低
0两个字符串的内容相等
>0第一个不匹配的字符在str1中的值大于在str2中的值

以上是关于字符串左旋问题的主要内容,如果未能解决你的问题,请参考以下文章

左旋字符串及其进阶

《剑指Offer——58:左旋转字符串》代码

字符串左旋

剑指offer—左旋转字符串

最强解析面试题:左旋转字符串

最强解析面试题:左旋转字符串