左旋字符串三大法(一学就会!!! 保证不废)

左旋字符串三大法

法1

一次次去左转,暴力旋转法

int main()
{
    
    
	char arr[] = "abcdef";
	int k = 0;
	scanf("%d", &k);
	int n = k % 4;
	int i = 0;
	char tmp = 0;
	int j = 0;
	int len = strlen(arr);
	for (i = 0; i < n; i++)
	{
    
    
		tmp = arr[0];
		for (j = 0; j < len - 1; j++)
		{
    
    
			arr[j] = arr[j + 1];
		}
		arr[j] = tmp;
	}
	printf("%s", arr);
	return 0;
}

法2

巧用字符串函数法 (但需要额外的一个数组)

int main()
{
    
    
	char arr[] = "abcdef";
	int k = 0;
	scanf("%d", &k);
	int n = k %= 4;
	int len = strlen(arr);
	char* p = (char*)malloc(len + 1);
	if (p == NULL)
	{
    
    
		perror("malloc ");
		return 1;
	}
	strcpy(p, arr + n);
	strncat(p, arr, n);
	strcpy(arr, p);
	printf("%s", arr);
	free(p);
	p = NULL;
	return 0;
}

法3

分成两部分,先逆序前半部分,再逆序后半部分,最后整体逆序

void reverse(char* arr, int start, int end)
{
    
    
	while (start < end)
	{
    
    
		char tmp = 0;
		tmp = arr[start];
		arr[start] = arr[end];
		arr[end] = tmp;
		start++;
		end--;
	}
}
int main()
{
    
    
	char arr[] = "abcdef";
	int start = 0;
	int len = 0;
	len = strlen(arr);
	int k = 0;
	int end = 0;
	scanf("%d", &k);
	k %= len;
	reverse(arr, start, k - 1);
	reverse(arr, k, len - 1);
	reverse(arr, start, len - 1);
	printf("%s", arr);

	return 0;
}

猜你喜欢

转载自blog.csdn.net/wan__xia/article/details/130040022