当前位置:网站首页>【C语言】字符串左旋

【C语言】字符串左旋

2022-07-06 05:58:00 SouLinya


题目

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

一、解法一:暴力求解法

图片来自其它博客

#include<stdio.h>
#include<string.h>
void Swap_arr(char* arr, int k)
{
    
	int len = strlen(arr);
	int i = 0;
	for (i = 0; i < k; i++)
	{
    
	    //保留首元素地址
		char temp = *arr;
		int j = 0;
		//字符前移
		for (j = 0; j < len - 1; j++)
		{
    
			*(arr + j) = *(arr + j + 1);
		}
		//最后把结尾字符赋值成首元素
		*(arr + len - 1) = temp;
	}
}
int main()
{
    
	char arr[] = "abcdef";
	int k;
	scanf("%d", &k);
	Swap_arr(arr, k);
	printf("%s", arr);
	return 0;
}

二、解法二:三步翻转法

思路:
假设左旋两个字符
1.先逆序前面两个字符
bacdef
2.逆序后面四个字符
bafedc
3.逆序整体
cdefab

#include<stdio.h>
//字符串逆序函数
void reverse(char* left, char* right)
{
    
	while (left < right)
	{
    
		char temp = *left;
		*left = *right;
		*right = temp;
		left++;
		right--;
	}
}
void Swap_arr(char* arr, int k)
{
    
    //计算字符串长度
	int len = strlen(arr);
	//逆序前面.注意传的参数
	reverse(arr, arr + k - 1);
	//逆序后面
	reverse(arr + k, arr + len - 1);
	//逆序整体
	reverse(arr, arr + len - 1);
}
int main()
{
    
	char arr[] = "abcdef";
	int k;
	scanf("%d", &k);
	Swap_arr(arr, k);
	printf("%s\n", arr);
	return 0;
}

三. 解法三:拼接法

思路:利用strcpy字符串拷贝函数和strncat字符串追加函数
ab cdef ab cdef

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>
void Swap_arr(char* arr, int k)
{
    
	assert(arr != NULL);
	int len = strlen(arr);
	//断开位置的下标
	int pos = k % len;
	//动态内存开辟空间:len+1的原因是字符串还有'\0'字符
	char* p = (char*)malloc((len+1) * sizeof(char));
	if (p == NULL)
	{
    
		printf("%s\n", strerror(errno));
	}
	else
	{
    
		//先拷贝后面的cdef
		strcpy(p, arr + pos);
		//再拷贝前面的ab
		strncat(p, arr, pos);
		//拷贝到源字符串当中
		strcpy(arr, p);
	}
}
int main()
{
    
	char arr[] = "abcdef";
	int k;
	scanf("%d", &k);
	Swap_arr(arr, k);
	printf("%s\n", arr);
	return 0;
}
原网站

版权声明
本文为[SouLinya]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_63449996/article/details/125584394