将字符串反转
简单的将字符串反转一下,如有“hello”,将前面三个字符串移到后面,那么结果是”lohel”,用代码实现。
现在直接上代码了,两种实现方式。
#include <iostream>
#include <cstdlib>
#include <cstring>
const int N = 1024;
///////////////
// 空间复杂度 O(k)
int string_spin(char *line, int k)
{
if (line == NULL || k <= 0)
return -1;
int len = strlen(line);
if (k >= len)
return 0;
char *p = new char[k+1];
int i = 0;
for (i = 0; i < k; i++)
p[i] = line[i];
p[i] = 0;
//line[i] = 0;
int j = 0;
for (i = k; i < len; i++)
{
line[j++] = line[i];
}
for (i = 0; i < k; i++)
{
line[j++] = p[i];
}
line[j] = 0;
std::cout << "j, len " << j << "," << len << std::endl;
delete [] p;
p = NULL;
return 0;
}
//////////
/////////////////
// 空间复杂度 O(1),比较有技巧性
int reverse_string(char *line, int low, int high);
int string_spin_1(char *line, int k)
{
if (line == NULL || k <= 0)
return -1;
int len = strlen(line);
if (k >= len)
return 0;
reverse_string(line, 0, k-1);
reverse_string(line, k, len-1);
reverse_string(line, 0, len-1);
return 0;
}
int reverse_string(char *line, int low, int high)
{
if (low >= high)
return -1;
int i = 0;
int len = high - low + 1;
int index = 0;
/*
if (len % 2 == 0) {
index = len / 2;
} else {
index = len / 2;
}
*/
index = len / 2;
i = 0;
char tmp;
for (i = 0; i < index; i++)
{
tmp = line[low+i];
line[low+i] = line[high-i];
line[high-i] = tmp;
}
return 0;
}
////////////////////////////
int main(int argc, char *argv[])
{
char line[N] = "helloworld";
std::cout << "org string " << line << std::endl;
int k = 3;
//int ret = string_spin(line, k);
int ret = string_spin_1(line, k);
std::cout << "spin string " << line << std::endl;
int i = 0;
for (i = 0; i < 10; i++)
std::cout << line[i];
std::cout << std::endl;
return 0;
}
比较有技巧性的解法。