字符串旋转可以有多种方法:
一为利用字符数组
二为利用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;
}
补充:
三步翻转法:
逆置函数
整段代码(嵌入式)如下:
更多推荐
字符串旋转问题
发布评论