《剑指offer》第五十八题II:左旋转字符串
// 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。 // 请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数 // 字2,该函数将返回左旋转2位得到的结果"cdefgab"。 #include <cstdio> #include "StringUtil.h" #include <string.h> char* LeftRotateString(char* pStr, int n) { if (pStr != nullptr) { int length = static_cast<int>(strlen(pStr)); if (length > 0 && n > 0 && n < length) { char* pFirstStart = pStr; char* pFirstEnd = pStr + n - 1; char* pSecondStart = pStr + n; char* pSecondEnd = pStr + length - 1; //反转第一部分 Reverse(pFirstStart, pFirstEnd); //反转第二部分 Reverse(pSecondStart, pSecondEnd); //反转整个字符串 Reverse(pFirstStart, pSecondEnd); } } return pStr; }
// ====================测试代码==================== void Test(const char* testName, char* input, int num, const char* expectedResult) { if (testName != nullptr) printf("%s begins: ", testName); char* result = LeftRotateString(input, num); if ((input == nullptr && expectedResult == nullptr) || (input != nullptr && strcmp(result, expectedResult) == 0)) printf("Passed.\n\n"); else printf("Failed.\n\n"); } // 功能测试 void Test1() { char input[] = "abcdefg"; char expected[] = "cdefgab"; Test("Test1", input, 2, expected); } // 边界值测试 void Test2() { char input[] = "abcdefg"; char expected[] = "bcdefga"; Test("Test2", input, 1, expected); } // 边界值测试 void Test3() { char input[] = "abcdefg"; char expected[] = "gabcdef"; Test("Test3", input, 6, expected); } // 鲁棒性测试 void Test4() { Test("Test4", nullptr, 6, nullptr); } // 鲁棒性测试 void Test5() { char input[] = "abcdefg"; char expected[] = "abcdefg"; Test("Test5", input, 0, expected); } // 鲁棒性测试 void Test6() { char input[] = "abcdefg"; char expected[] = "abcdefg"; Test("Test6", input, 7, expected); } int main(int argc, char* argv[]) { Test1(); Test2(); Test3(); Test4(); Test5(); Test6(); return 0; }
分析:拓展用法。
class Solution { public: string LeftRotateString(string str, int n) { if (!str.empty()) { int length = str.length(); if (length > 0 && n > 0 && n < length) { int firstBegin = 0; int firstEnd = n - 1; int secondBegin = n; int secondEnd = length - 1; Reverse(str, firstBegin, firstEnd); Reverse(str, secondBegin, secondEnd); Reverse(str, firstBegin, secondEnd); } } return str; } void Reverse(string &str, int begin, int end) { while (begin < end) { char temp = str[begin]; str[begin] = str[end]; str[end] = temp; ++begin; --end; } } };