一个字符串和一个正整数k,你需要对从字符串开头算起的每3k个字符的前K个字符进行反转。如果剩余少于k个字符,则将所剩余的所有字符串全部反转。如果小于3k但是大于或等于k个字符,则反转前k个字符,并将所剩余的字符保持原样。
输入描述:
输入需要反转的字符串s与正整数k(k>0)
输出描述:
输出经过反转后的字符串
实例1
输入
welcometokeep 2
输出
ewlcomteokeep
采用递归解法,判断剩余字符串与总字符长度的关系进行分支实现要求的移动。无返回类型直接对字符串中字符进行了移动反转。
#include<iostream>
using namespace std;
#include<stdio.h>
void fun(char *str, int k)
{
assert(str != NULL);
int len = strlen(str);
int overlen = len;
if (overlen == 0)
{
return;
}
//for (int j = k - 1; j >= 0; j--)
// cout<<*(str + j);
//for (int i = k; i < 3 * k; ++i) //每次反正前k个字符
// cout << *(str + i);
char tmp;
for (int m = 0, j = k - 1; m <= k / 2, j >= k / 2; m++, j--)
{
tmp = *(str + m);
*(str + m) =*(str + j);
*(str + j) = tmp;
}
overlen -= 3*k;
if (3 * k < overlen)
fun((str + 3 * k), k);
if (overlen < k)//如果剩余字符小于K ,则剩余全部反转
{
for (int i = 0, j = overlen - 1; i < overlen / 2, j >= overlen / 2; ++i, --j)
{
tmp = *(str + i);
*(str + i) = *(str + j);
*(str + j) = tmp;
}
}
else if (overlen < 3 * k || overlen == k)//如果剩余字符小于3k,或是等于K 则反转k个字符
{
for (int i = 0, j = k - 1; i < k / 2, j >= k / 2; ++i, --j)
{
tmp = *(str + i);
*(str + i) = *(str + j);
*(str + j) = tmp;
}
}
}
int main()
{
char a[] = "welcometokeep";
cout << a << endl;
fun(a, 2);
cout <<a<< endl;
system("pause");
return 0;
}