字符串旋转可以有多种方法:

一为利用字符数组

二为利用string

1.利用字符数组时

a.分别将前面的几个字符和后面的字符存放在一个新数组中,然后再打印这个数组

b.将前面和后面的字符分别逆序了之后在整体逆序

c.旋转几次就相当于几次旋转1次,(采用循环的方式)

2.直接利用string

下面为几个代码:(仅供参考)

#include<iostream>
#include<string>
using namespace std;
int main()
{
    int n = 0;
    int a[100];
    cin >> n;
    string s[100];
    string j[100];
    char m[21];
    for (int i = 0; i < n; i++)
    {
        cin >> s[i] >> m[i] >> a[i];//要找准每个分别对应的类型
    }

    for (int i = 0; i < n; i++)
    {
        int len = s[i].length();
        a[i] %= len;
        if (m[i] == 'L')
        {
            j[i] = s[i].substr(0, a[i]);//substr的用法,第一个为起始位置 第二个为复制的字符数目
            s[i].erase(0, a[i]);
            s[i] = s[i] + j[i];
            string x = s[i];
            for (int k = 0; k < len; k += 2)
                cout << x[k];
        }
        else if (m[i] == 'R')
        {
            j[i] = s[i].substr(len - a[i], a[i]);
            s[i].erase(len - a[i], a[i]);
            s[i].insert(0, j[i]);
            string x = s[i];
            for (int k = 0; k < len; k += 2)
                cout << x[k];
        }
        else
        {
            string x = s[i];
            for (int k = 0; k < len; k += 2)
                cout << x[k];
        }
        cout << endl;

    }
    return 0;

}

(有关string类的 其格式一般均为s.insert(起始位置.进行该操作的长度))

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
	int N = 0;
	cin >> N;//输入有几组数
	char a[15];//输入的数组
	char b;//输入‘L’or‘N’
	int n = 0;//输入旋转几位
	char arr[20];//存是左旋还是右旋
	char arr2[20][15];//存输入的数组
	int arr1[15];//存旋转几位
	int i = 0;
	int sz = 0;
	int arrsz[20];//存有几位以防移动
	int m = 0;
	char fang[20][15];
	for (i = 0; i < N; i++)
	{
		cin >> a;
		sz = strlen(a);

		arrsz[i] = sz;
		for (int j = 0; j < sz; j++)
		{
			arr2[i][j] = a[j];
		}
		cin >> b;
		arr[i] = b;
		cin >> n;

		n %= sz;
		arr1[i] = n;
	}
	for (i = 0; i < N; i++)
	{
		if (arr[i] == 'L')
		{
			int j = 0;
			for (int j = arr1[i]; j < arrsz[i]; j++)
			{
				fang[i][j- arr1[i]]= arr2[i][j];
			}
			for (int j = 0; j < arr1[i]; j++)
			{
				fang[i][arrsz[i]-arr1[i]+j] = arr2[i][j];
			}
			for (int j = 0; j < arrsz[i]; j++)
			{
				if (j % 2 == 0)
				{
					cout << fang[i][j];
				}
			}
			cout << endl;
		}
		else if (arr[i] == 'R')
		{
			int j = 0;
			for (int j = 0; j < arrsz[i] - arr1[i]; j++)
			{
				fang[i][arr1[i] + j] = arr2[i][j];
			}
			for (int j = arrsz[i]- arr1[i]; j < arrsz[i]; j++)
			{
				fang[i][j - arrsz[i] + arr1[i]] = arr2[i][j];
			}

			for (int j = 0; j < arrsz[i]; j++)
			{
				if (j % 2 == 0)
				{
					cout << fang[i][j];
				}
			}
			cout << endl;
		}
		else
		{
			for (int j = 0; j < arrsz[i]; j++)
			{
				if (j % 2 == 0)
				{
					cout << arr2[i][j];
				}
			}
		}

	}


	return 0;
}


#include<iostream>
#include<cstring>
using namespace std;
void revolve_left(char s[], int k, int len)
{
	char tmp;
	int i = 0;
	int j = 0;
	for (i = 0; i < k; i++)
	{
		tmp = s[0];
		for (j = 0; j < len; j++)
		{
			s[j] = s[j + 1];
		}
		s[len-1] = tmp;

	}
}
void revolve_right(char s[], int k, int len)
{
	char tmp;
	int i = 0;
	int j = 0;
	for (i = 0; i < k; i++)
	{
		for (j = 0; j < len; j++)
		{
			tmp = s[len - 1];
			s[j + 1] = s[j];
		}
		s[0] = tmp;
	}
}
int main()
{
	char arr[20];
	cin >> arr;
	int ret = strlen(arr);
	revolve_left(arr,5,ret);
	cout << arr<<endl;
	return 0;
}


补充:

三步翻转法:

 逆置函数

 整段代码(嵌入式)如下:

 

 

更多推荐

字符串旋转问题