實現字符串的旋轉

給定一個字符串,要求將字符串前面的若干個字符轉移到字符串的尾部,例如:將「abcdef」的前3個字符‘a、’b‘、’c‘移到字符串的尾部。this

解法一:蠻力移位blog

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void left_shift_one(char *src, int n);

void left_rotate_string(char *src, int n, int m);

int main(int argc, char *argv[])
{
	char str[] = "this is left";

	printf("before:\n");
	printf("%s\n", str);
	
	left_rotate_string(str, strlen(str), 5);

	printf("after:\n");
	printf("%s\n", str);

	return 0;
}

void left_shift_one(char *src, int n)
{
	if (NULL == src)
	{
		return ;
	}

	char t = src[0];
	for (int i = 1; i < n; ++i)
	{
		src[i - 1] = src[i];
	}
	src[n - 1] = t;
}

void left_rotate_string(char *src, int n, int m)
{
	if (NULL == src)
	{
		return ;
	}

	while (m--)
	{
		left_shift_one(src, n);
	}
}

 解法二:三部反轉字符串

以「abcdef」爲例string

1)將元字符串分爲X和Y兩個部分,X爲」abc「,Y爲」def「io

2)將X的全部字符反轉,即至關於反轉」abc「獲得」cba「,再將Y的全部字符也反轉,將」def「反轉爲」fed「class

3)最後將以上獲得的結果再總體反轉,即」cbafed「獲得」defabc「gc

#include <stdio.h>
#include <string.h>

void reverse_string(char *src, int from, int to);

void left_rotate_string(char *src, int n, int m);

int main(int argc, char *argv[])
{
	char str[] = "abcdef";
	int m = 3;

	printf("%s\n", str);

	left_rotate_string(str, strlen(str), m);

	printf("%s\n", str);

	return 0;
}

void reverse_string(char *src, int from, int to)
{
	if (NULL == src)
	{
		return ;
	}

	while (from < to)
	{
		char tem = src[from];
		src[from++] = src[to];
		src[to--] = tem;
	}
}

void left_rotate_string(char *src, int n, int m)
{
	if (NULL == src)
	{
		return ;
	}

	m %= n;
	reverse_string(src, 0, m - 1);
	reverse_string(src, m, n - 1);
	reverse_string(src, 0, n - 1);
}
相關文章
相關標籤/搜索