一、题目一:翻转单词顺序

1.1 题目说明

题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student.",则输出"student. a am I"。

1.2 解题思路

  第一步翻转句子中所有的字符。比如翻转"I am a student."中所有的字符得到".tneduts a ma I",此时不但翻转了句子中单词的顺序,连单词内的字符顺序也被翻转了。

  这个步骤我们大多数都很熟悉,看看下面这个Reverse方法,是不是非常熟悉?

    public static void Reverse(char[] array, int start, int end)
{
if (array == null || start < || end > array.Length - )
{
return;
} while (start < end)
{
char temp = array[start];
array[start] = array[end];
array[end] = temp; start++;
end--;
}
}

  第二步再翻转每个单词中字符的顺序,就得到了"student.a am I"。这正是符合题目要求的输出。因此,我们可以将上述思路实现为以下代码:

    public static string ReverseSentense(string sentense)
{
if (string.IsNullOrEmpty(sentense))
{
return null;
} char[] array = sentense.ToCharArray();
int start = ;
int end = array.Length - ; // Step1.先翻转整个句子
Reverse(array, start, end);
// Step2.再翻转句中的每个单词
start = end = ;
while (start < array.Length)
{
if (array[start] == ' ')
{
start++;
end++;
}
else if (end == array.Length || array[end] == ' ')
{
Reverse(array, start, --end);
start = end + ;
end++;
}
else
{
end++;
}
} return new string(array);
}

1.3 单元测试

  (1)测试用例

    // 功能测试,句子中有多个单词
[TestMethod]
public void ReverseTest1()
{
string input = "I am a student.";
string actual = ReverseWordsHelper.ReverseSentense(input);
string expected = "student. a am I"; Assert.AreEqual(actual, expected);
} // 功能测试,句子中只有一个单词
[TestMethod]
public void ReverseTest2()
{
string input = "Wonderful";
string actual = ReverseWordsHelper.ReverseSentense(input);
string expected = "Wonderful"; Assert.AreEqual(actual, expected);
} // 边界值测试,测试空字符串
[TestMethod]
public void ReverseTest3()
{
string input = "";
string actual = ReverseWordsHelper.ReverseSentense(input); Assert.AreEqual(actual, null);
} // 边界值测试,字符串中只有空格
[TestMethod]
public void ReverseTest4()
{
string input = " ";
string actual = ReverseWordsHelper.ReverseSentense(input);
string expected = " "; Assert.AreEqual(actual, expected);
} // 鲁棒性测试
[TestMethod]
public void ReverseTest5()
{
string actual = ReverseWordsHelper.ReverseSentense(null); Assert.AreEqual(actual, null);
}

  (2)测试结果

  ①测试用例通过情况

  ②代码覆盖率统计

二、题目二:左旋转字符串

2.1 题目说明

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

2.2 解题思路

  这两个问题是非常相似的,我们同样可以通过翻转字符串的办法来解决第二个问题。

  以"abcdefg"为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符都分到第二部分。我们先分别翻转这两部分,于是就得到"bagfedc"。接下来我们再翻转整个字符串,得到的"cdefgab"刚好就是把原始字符串左旋转2位的结果。

  通过分析可以发现,我们只需要调用三次Reverse方法就可以实现字符串的左旋转功能

    public static string LeftRotateString(string str, int num)
{
if (string.IsNullOrEmpty(str))
{
return null;
} int strLength = str.Length;
char[] array = str.ToCharArray(); if (strLength > && num > && num < strLength)
{
int firstStart = ;
int firstEnd = num - ;
int secondStart = num;
int secondEnd = strLength - ; // 翻转字符串的前面n个字符
Reverse(array, firstStart, firstEnd);
// 翻转字符串的后面部分
Reverse(array, secondStart, secondEnd);
// 翻转整个字符串
Reverse(array, , strLength - );
} return new string(array);
}

2.3 单元测试

  (1)测试用例

    // 功能测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest1()
{
string input = "abcdefg";
string actual = ReverseWordsHelper.LeftRotateString(input, );
string expected = "cdefgab"; Assert.AreEqual(actual, expected);
} // 边界值测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest2()
{
string input = "abcdefg";
string actual = ReverseWordsHelper.LeftRotateString(input, );
string expected = "bcdefga"; Assert.AreEqual(actual, expected);
} // 边界值测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest3()
{
string input = "abcdefg";
string actual = ReverseWordsHelper.LeftRotateString(input, );
string expected = "gabcdef"; Assert.AreEqual(actual, expected);
} // 鲁棒性测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest4()
{
string actual = ReverseWordsHelper.LeftRotateString(null, ); Assert.AreEqual(actual, null);
} // 鲁棒性测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest5()
{
string input = "abcdefg";
string actual = ReverseWordsHelper.LeftRotateString(input, );
string expected = "abcdefg"; Assert.AreEqual(actual, expected);
} // 鲁棒性测试
[TestCategory("LeftRotate")]
[TestMethod]
public void RotateTest6()
{
string input = "abcdefg";
string actual = ReverseWordsHelper.LeftRotateString(input, );
string expected = "abcdefg"; Assert.AreEqual(actual, expected);
}

  (2)测试结果

  ①用例通过情况

  ②代码覆盖率

作者:周旭龙

出处:http://edisonchou.cnblogs.com

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

剑指Offer面试题:34.翻转单词顺序VS左旋转字符串的更多相关文章

  1. 剑指Offer - 九度1361 - 翻转单词顺序

    剑指Offer - 九度1361 - 翻转单词顺序2013-11-23 02:45 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fi ...

  2. 【面试题042】翻转单词顺序VS左旋转字符串

    [面试题042]翻转单词顺序VS左旋转字符串 题目一:     输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理.     例如输入字符串“I a ...

  3. 《剑指offer》第五十八题(左旋转字符串)

    // 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcde ...

  4. 【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ

    题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&qu ...

  5. 翻转单词顺序 VS 左旋转字符串

    全部内容来自<剑指offer>. 题目一: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字符一样处理.例如输入字符串“I am a stude ...

  6. 【剑指offer】面试题42:翻转单词顺序 VS 左旋转字符串

    题目: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcX ...

  7. 面试题42:翻转单词顺序VS左旋转字符串

    题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I am a student.",则输出"stud ...

  8. 翻转单词顺序VS左旋转字符串

    题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理.例如输入“I am a student.”,则输出“student ...

  9. 剑指offer——翻转单词顺序VS左旋转字符串

    字符串的交换等,注意判断字符串的是否为NULL,以及判断边界等. #include <iostream> #include <string> using namespace s ...

随机推荐

  1. Datazen安装

    Datazen是被微软收购的移动端全平台的数据展现解决方案.此篇主要介绍其安装过程. 下载页面,需要留意一下的是目前还没有中文版: http://www.datazen.com/start/ 点击Do ...

  2. C++ 系列:C++ 基础 002

    Copyright © 1900-2016, NORYES, All Rights Reserved. http://www.cnblogs.com/noryes/ 欢迎转载,请保留此版权声明. -- ...

  3. Spring MVC 学习 -- 创建过程

    Spring MVC 学习 -- 创建过程 Spring MVC我们使用的时候会在web.xml中配置 <servlet> <servlet-name>SpringMVC< ...

  4. vue学习之旅

    大纲: 属性 事件 循环 指令 交互 过滤器 模板 计算属性 自定义过滤器和指令 组件(父子组件之间的通讯) 路由和多层路由以及占位槽slot等其他 vue-loader和模块加载(webpack)等 ...

  5. ubuntu 用apt-get 安装apache 和php 之后php不能解析的问题

    sudo apt-get install apache2 sudo apt-get install php7.0 sudo apt-get install libapache2-mod-php //关 ...

  6. kindeditor-4.1.3工具使用技巧:如何在编辑区上传图片并保存绝对路径

    MVC项目开中用到了KindEditor图片上传工具,需要在编辑区内上传图片,并将图片的URL保存为符合如下格式地址,如http://192.168.0.111/uploadImg/imgName.j ...

  7. Shader实例:NGUI图集中的UISprite正确使用Shader的方法

    效果: 变灰,过滤,流光 都是UI上常用效果. 比如: 1.按钮禁用时,变灰. 2.一张Icon要应付圆形背景框,又要应付矩形背景框.就要使用过滤的方式来裁剪. 避免了美术提供两张icon的麻烦,又节 ...

  8. 文件处理命令:awk

    awk擅长于对数据进行分析并生成报告,简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. 使用方法:awk '{pattern +action}' {fi ...

  9. js学习笔记之标准库

    在全局函数中,this等于window  在函数被作为某个对象的方法调用时,this等于那个对象. 数组的函数: 检测:Array.isArray() 转换:toString(),toLocalStr ...

  10. smack 4.1创建群聊

    smack 4.1.1版本对群聊修改了很多,MultUserChat的构造函数修改成了私有,以前通过new MultUserChat创建聊天室,现在通过MultUserChatMananger先通过r ...