/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
/*
Q1:
翻转单词的顺序:
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序保持不变。
为简单起见,标点符号和普通字符一样处理。
S1:
1. 这里通过两次进行翻转,首先把整个句子翻转然后得到全部字符都翻转的结果;
再对第一次翻转的结果做每个单词的翻转,间隔以单词之间的空格符作为分割。
Q2:
左旋转字符串:
输入一个字符串,把字符串前面的若干个字符转移到字符串的末尾。
例如
输入:abcdefgh 2
输出:cdefghab
S2:
1. 通过第一个问题我们可以知道,对于字符abcdefgh,我们可以先把字符划分为
ab和cdefgh两部分,然后分别进行翻转,得到bahgfedc,然后对这个字符进行
选择得到:cdefghab,即为所求。
*/
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
void reverseString(char*pBegin, char*pEnd)
{
if(pBegin == nullptr || pEnd == nullptr)
return;
while(pBegin < pEnd)
{
char tmp = *pBegin;
*pBegin = *pEnd;
*pEnd = tmp;
pBegin++;
pEnd--;
}
}
char*reverStr(char*pData)
{
if(pData == nullptr)
return nullptr;
char*pBegin = pData;
char*pEnd = pData;
while(*pEnd != '\0')
pEnd++;
pEnd--;
// std::cout << *pBegin << " " << *pEnd << std::endl;
reverseString(pBegin, pEnd);
pBegin = pEnd = pData;
while(*pBegin != '\0')
{
if(*pBegin == ' ')
{
pBegin++;
pEnd++;
}else if(*pEnd == '\0' || *pEnd == ' ')
{
reverseString(pBegin, --pEnd);
pEnd++;
pBegin = pEnd;
}else{
pEnd++;
}
}
return pData;
}
char*leftRotateStr(char*pData, int n)
{
if(pData == nullptr)
return nullptr;
int length = static_cast<int>(strlen(pData));
if(length > 0 && n > 0 && (n < length))
{
char*p_1 = pData;
char*p_2 = pData + n - 1;
char*p_3 = pData + n;
char*p_4 = pData + length -1;
reverseString(p_1, p_2);
reverseString(p_3, p_4);
reverseString(p_1, p_4);
}
return pData;
}
void test_1()
{
std::cout << "Test 1" << std::endl;
char pData[] = "I am a student.";
std::cout << pData << std::endl;
char*rst = reverStr(pData);
std::cout << rst << std::endl;
char data_2[] = "abcdefgh";
std::cout << data_2 << std::endl;
char*rst_2 = leftRotateStr(data_2, 2);
std::cout << rst_2 << std::endl;
}
void test_2()
{
std::cout << "Test 2" << std::endl;
char pData[] = "I";
std::cout << pData << std::endl;
char*rst = reverStr(pData);
std::cout << rst << std::endl;
char data_2[] = "abcdefgh";
std::cout << data_2 << std::endl;
char*rst_2 = leftRotateStr(data_2, 1);
std::cout << rst_2 << std::endl;
}
void test_3()
{
std::cout << "Test 3" << std::endl;
char pData[] = " ";
std::cout << "1" << pData << "1" << std::endl;
char*rst = reverStr(pData);
std::cout << rst << std::endl;
char data_2[] = "";
std::cout << data_2 << std::endl;
char*rst_2 = leftRotateStr(data_2, 2);
std::cout << rst_2 << std::endl;
}
void test_4()
{
std::cout << "Test 4" << std::endl;
char pData[] = "";
std::cout << pData << std::endl;
char*rst = reverStr(pData);
std::cout << rst << std::endl;
char data_2[] = " ";
std::cout << data_2 << std::endl;
char*rst_2 = leftRotateStr(data_2, 2);
std::cout << rst_2 << std::endl;
}
void test_5()
{
std::cout << "Test 5" << std::endl;
char*pData = nullptr;
std::cout << pData << std::endl;
char*rst = reverStr(pData);
std::cout << rst << std::endl;
char*data_2 = nullptr;;
std::cout << data_2 << std::endl;
char*rst_2 = leftRotateStr(data_2, 2);
std::cout << rst_2 << std::endl;
}
void test_reverseStr()
{
test_1();
test_2();
test_3();
test_4();
test_5();
}
int main(int argc, char**argv)
{
test_reverseStr();
return 0;
}