// 面试题58(二):左旋转字符串
// 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。
// 请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcdefg"和数
// 字2,该函数将返回左旋转2位得到的结果"cdefgab"。 #include <iostream>
#include <string> void Reverse(char *pBegin, char *pEnd); char* LeftRotateString(char* pStr, int n)
{
if (pStr != nullptr)//防止为空,这很重要
{
int nLength = static_cast<int>(strlen(pStr));
if (nLength > && n > && n < nLength)
{
char* pFirstStart = pStr;//设置两段,前n个为一段
char* pFirstEnd = pStr + n - ;
char* pSecondStart = pStr + n;//后面为一段
char* pSecondEnd = pStr + nLength - ; // 翻转字符串的前面n个字符
Reverse(pFirstStart, pFirstEnd);
// 翻转字符串的后面部分
Reverse(pSecondStart, pSecondEnd);
// 翻转整个字符串
Reverse(pFirstStart, pSecondEnd);
}
} return pStr;
} void Reverse(char *pBegin, char *pEnd)//交换子函数
{
if (pBegin == nullptr || pEnd == nullptr)
return; while (pBegin < pEnd)
{
char temp = *pBegin;
*pBegin = *pEnd;
*pEnd = temp; pBegin++, pEnd--;
}
}
// ====================测试代码====================
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) == ))
printf("Passed.\n\n");
else
printf("Failed.\n\n");
} // 功能测试
void Test1()
{
char input[] = "abcdefg";
char expected[] = "cdefgab"; Test("Test1", input, , expected);
} // 边界值测试
void Test2()
{
char input[] = "abcdefg";
char expected[] = "bcdefga"; Test("Test2", input, , expected);
} // 边界值测试
void Test3()
{
char input[] = "abcdefg";
char expected[] = "gabcdef"; Test("Test3", input, , expected);
} // 鲁棒性测试
void Test4()
{
Test("Test4", nullptr, , nullptr);
} // 鲁棒性测试
void Test5()
{
char input[] = "abcdefg";
char expected[] = "abcdefg"; Test("Test5", input, , expected);
} // 鲁棒性测试
void Test6()
{
char input[] = "abcdefg";
char expected[] = "abcdefg"; Test("Test6", input, , expected);
} int main(int argc, char* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
Test6();
system("pause");
return ;
}

《剑指offer》第五十八题(左旋转字符串)的更多相关文章

  1. 《剑指offer》第二十八题(对称的二叉树)

    // 面试题28:对称的二叉树 // 题目:请实现一个函数,用来判断一棵二叉树是不是对称的.如果一棵二叉树和 // 它的镜像一样,那么它是对称的. #include <iostream> ...

  2. 《剑指offer》第十八题(删除链表中重复的结点)

    // 面试题18(二):删除链表中重复的结点 // 题目:在一个排序的链表中,如何删除重复的结点?例如,在图3.4(a)中重复 // 结点被删除之后,链表如图3.4(b)所示. #include &l ...

  3. 《剑指offer》第十八题(在O(1)时间删除链表结点)

    // 面试题18(一):在O(1)时间删除链表结点 // 题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该 // 结点. #include <iostream> ...

  4. (剑指Offer)面试题42:左旋转字符串

    题目: 字符串的左旋转操作是把字符串前面的若干字符转移到字符串的后面.请定义一个函数实现字符串左旋转操作的功能, 比如:输入字符串"abcdefg"和数字2,该函数将返回左旋转2位 ...

  5. 《剑指offer》面试题58 - II. 左旋转字符串

    问题描述 字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部.请定义一个函数实现字符串左旋转操作的功能.比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两 ...

  6. 剑指Offer(二十八):数组中出现次数超过一半的数字

    剑指Offer(二十八):数组中出现次数超过一半的数字 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn. ...

  7. 《剑指offer》第二十六题(树的子结构)

    // 面试题26:树的子结构 // 题目:输入两棵二叉树A和B,判断B是不是A的子结构. #include <iostream> struct BinaryTreeNode { doubl ...

  8. 《剑指offer》第十九题(正则表达式匹配)

    // 面试题19:正则表达式匹配 // 题目:请实现一个函数用来匹配包含'.'和'*'的正则表达式.模式中的字符'.' // 表示任意一个字符,而'*'表示它前面的字符可以出现任意次(含0次).在本题 ...

  9. 《剑指offer》第二十九题(顺时针打印矩阵)

    // 面试题29:顺时针打印矩阵 // 题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字. #include <iostream> void PrintMatrixInC ...

  10. 《剑指offer》第二十四题(反转链表)

    // 面试题24:反转链表 // 题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的 // 头结点. #include <iostream> #include &quo ...

随机推荐

  1. oracle No more data to read from socket之ora-07445排查解决

    今天下午,原来一个部门的同事找过来,说有个即将上线的环境偶尔会出现 No more data to read from socket错误,版本是oracle 11.2.0.1,如下: 经查,这个问题原 ...

  2. devexpress 之 ChartControl

    \}5#~mV#cr(/k1yIZ7.Lg

  3. 05: greenlet:轻量级的并发编程

    网络编程其他篇 1.1 greenlet简介 1.greenlet原理 & 使用 1. greenle间切换 1)一个 “greenlet” 是一个很小的独立微线程,可以把它想像成一个堆栈帧, ...

  4. 2018年北京信息科技大学第十届程序设计竞赛暨ACM选拔赛题解

    链接:https://www.nowcoder.com/acm/contest/118/A 来源:牛客网 PUBG 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语 ...

  5. [内核驱动] DOS路径转化为NT路径

    转载:http://blog.csdn.net/qq_33504040/article/details/78468278 最近在做一个文件过滤驱动程序,禁止访问指定目录或文件.想要从R3给R0发命令和 ...

  6. 尚硅谷面试第一季-15Mysql什么时候建索引

    课堂重点: MySQL的官方定义: 索引的优势: 索引的劣势: 那些情况下需要建立索引: 那些情况下不要建立索引: 何为过滤性:例如在数据库字段里,手机号/身份证号这些字段是过滤性好的字段,而性别则是 ...

  7. easyui-datagrid合并相同行功能扩展

    //合并相同行$.extend($.fn.datagrid.methods, { autoMergeCells: function (jq, fields) { return jq.each(func ...

  8. C# 文件与二进制之间的转换

    /// <summary> /// 工具类:文件与二进制流间的转换 /// </summary> public class FileBinaryConvertHelper { ...

  9. 学习dart从这里开始

    void main() { ; i < ; i++) { print('hello ${i + 1}'); } } // 定义个方法. printNumber(num aNumber) { pr ...

  10. P3338 [ZJOI2014]力

    思路 颓柿子的题目 要求求这样的一个式子 \[ F_j=\sum_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum_{i>j}\frac{q_iq_j}{(i-j)^2} ...