您的位置:首页 > 其它

IT公司100题-26-左旋转字符串

2014-08-21 16:46 211 查看
问题描述:
给定字符串和左旋的字符数,写程序实现字符串的左旋操作。例如对于字符串”12345678″, 左旋转4个字符后,变成”56781234″。要求时间复杂度为O(n),空间复杂度O(1)。

分析:
假设字符串表示为XY,X表示需要左旋的部分,左旋后字符串表示为YX。
根据公式:



代码实现:

// 26.cc
#include <iostream>
#include <string>
#include <cstring>
using namespace std;

// 反转字符串
void reverse_str(char* start, char* end) {
if (!start || !end)
return;
while (start < end) {
swap(*start, *end);
start++;
end--;
}
}

// 左移k个字符
void left_rotate_str(char*& str, size_t k) {
if (!str || k <= 0)
return;

size_t n = strlen(str);
k = k % n;

reverse_str(str, str + k - 1);
reverse_str(str + k, str + n - 1);
reverse_str(str, str + n - 1);
}

int main() {
cout << "input a str:" << endl;

string s;
getline(cin, s);

char* str = new char[s.size() + 1];
strcpy(str, s.c_str());
int k = 5 < s.size() ? 5 : 0;
left_rotate_str(str, k);

cout << "after left rotate " << k << " chars:" << endl << str << endl;
return 0;
}


输出:

$ ./a.exe
input a str:
12345678
after left rotate 5 chars:
67812345
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: