// 面试题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. P2219 [HAOI2007]修筑绿化带(单调队列)

    P2219 [HAOI2007]修筑绿化带 二维单调队列 写了这题 P2216 [HAOI2007]理想的正方形  后,你发现可以搞个二维单调队列 来保存矩形(i+1,i+A-1)(j+1,j+B-1 ...

  2. Linux普通用户不能使用TAB键、上下键

    出发点 今天安装使用kail linux的时候发现tab键命令不能补全, 结合ubuntu, 因默认ubuntu创建的普通帐号,默认shell为/bin/sh,而这不支持tab等键的,所以将「指定用户 ...

  3. update与select关联执行效率问题

    UPDATE fl_user_space u SET u.`course_count` = (SELECT COUNT(*) FROM fl_course c WHERE c.uid = u.uid) ...

  4. (6CBIR模拟问题)自己动手,编写神经网络程序,解决Mnist问题,并网络化部署

    个方面: 最初的图像检索研究主要集中在如何选择合适的全局特征去描述图像内容和采用什么样的相似性度量方法进行图像匹配. 第二个研究热点是基于区域的图像检索方法,其主要思想是图像分割技术提取出图像中的物体 ...

  5. 清理sqlserver 2012 日志文件

    http://www.cnblogs.com/q149072205/p/4380944.html 1.先把数据库设置为简单模式(右击数据库名->点'属性'->点'选项'->恢复模式改 ...

  6. Python3 tkinter基础 Listbox height 显示行数的上限

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. Cmder + Babun 打造 Windows 好用的终端工具

    Babun a windows shell you will love Babun features the following: Pre-configured Cygwin with a lot o ...

  8. linux内核中的fuse是什么?

    答: 一个用户态文件系统框架,属于内核的一种特性. 1.组成部分 fuse.ko(内核模块) + libfuse.*(用户空间库) + fusemount(挂载工具) 2.参考资料 fuse.txt

  9. tp框架中的一些疑点知识-4

    $_SERVER的几个元素: script_name脚本名称, 是指这个脚本文件本身的文件名, 通常只是 : /index.php path_info: 是从控制器/操作方法开始到最后的内容,包括路径 ...

  10. SpringBoot Mybatis问题收集

    1.在SpringBoot中打印mybatis中执行的sql 其实在application.properties 文件下,添加一下配置即可: logging.level.org.springframe ...