剑指Offer面试题:34.翻转单词顺序VS左旋转字符串
一、题目一:翻转单词顺序
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)测试结果
①用例通过情况
②代码覆盖率
剑指Offer面试题:34.翻转单词顺序VS左旋转字符串的更多相关文章
- 剑指Offer - 九度1361 - 翻转单词顺序
剑指Offer - 九度1361 - 翻转单词顺序2013-11-23 02:45 题目描述: JOBDU最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fi ...
- 【面试题042】翻转单词顺序VS左旋转字符串
[面试题042]翻转单词顺序VS左旋转字符串 题目一: 输入一个英文句子,反转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I a ...
- 《剑指offer》第五十八题(左旋转字符串)
// 面试题58(二):左旋转字符串 // 题目:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部. // 请定义一个函数实现字符串左旋转操作的功能.比如输入字符串"abcde ...
- 【剑指Offer面试编程题】题目1362:左旋转字符串--九度OJ
题目描述: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=&qu ...
- 翻转单词顺序 VS 左旋转字符串
全部内容来自<剑指offer>. 题目一: 输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字符一样处理.例如输入字符串“I am a stude ...
- 【剑指offer】面试题42:翻转单词顺序 VS 左旋转字符串
题目: 汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果.对于一个给定的字符序列S,请你把其循环左移K位后的序列输出.例如,字符序列S=”abcX ...
- 面试题42:翻转单词顺序VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.为简单起见,标点符号和普通字母一样处理. 例如输入字符串“I am a student.",则输出"stud ...
- 翻转单词顺序VS左旋转字符串
题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变.句子中单词以空格符隔开.为简单起见,标点符号和普通字母一样处理.例如输入“I am a student.”,则输出“student ...
- 剑指offer——翻转单词顺序VS左旋转字符串
字符串的交换等,注意判断字符串的是否为NULL,以及判断边界等. #include <iostream> #include <string> using namespace s ...
随机推荐
- TDD学习笔记【一】----序言
提到TDD大多数程序员的疑问: 为什么我要写两份程序? 为什么我要写程序来验证我已经知道的结果? 我又不是SA,可能也不懂domain,怎么产生一开始的test case? 最后的感想就变成是: 1. ...
- maven权威指南学习笔记(三)——一个简单的maven项目
目标: 对构建生命周期 (build lifecycle),Maven仓库 (repositories),依赖管理 (dependency management)和项目对象模型 (Project O ...
- 学习微信小程序之css11内外边距集合
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Tomat简介
Tomcat目录结构bin: 存放各种平台下启动和关闭Tomcat的脚本文件.startup.bat是windows下启动tomcat的文件,shutdown.bat是关闭tomcat的文件.comm ...
- BIAWGN信道
想到这个问题是因为平时使用的香农公式是 C=0.5*log2(1+SNR),后面才发现香农公式针对的好像是输入时高斯分布的情况,这种情况下用互信息来推导也可以看到: \[\begin{array}{c ...
- Lattice Codes
最近在做的一些关于lattice codes的工作,想记录下来. 首先,我认为lattice coding是一种联合编码调制技术,将消息序列映射到星座点.其中一个良好的性质是lattice point ...
- PHP 显示文章发布日期 一小时前 一天前 一月前 一年前
<?PHP /*** 传入日期格式或时间戳格式时间,返回与当前时间的差距,如1分钟前,2小时前,5月前,3年前等* @param string or int $date 分两种日期格式" ...
- Effective C++ 笔记2(构造,析构,赋值)
条款5:了解C++默默编写并且调用了哪些函数 1. 构造函数,析构函数,拷贝赋值函数,拷贝构造函数. class Empty { public: //默认构造函数 Empty(){}; //拷贝构造 ...
- 【刷题记录】 && 【算法杂谈】折半枚举与upper_bound 和 lower_bound
[什么是upper_bound 和 lower_bound] 简单来说lower_bound就是你给他一个非递减数列[first,last)和x,它给你返回非递减序列[first, last)中的第一 ...
- Theano 学习笔记(一)
Theano 学习笔记(一) theano 为什么要定义共享变量? 定义共享变量的原因在于GPU的使用,如果不定义共享的话,那么当GPU调用这些变量时,遇到一次就要调用一次,这样就会花费大量时间在数据 ...