2019.1.2 《剑指Offer》从零单刷个人笔记整理(66题全)目录传送门
网上很多方法,包括原书上的方法都是对句子进行两次翻转,第一次整个字符串翻转,第二个以空格为间隔对每一个单词进行翻转。如果用Java的话可以不用这么麻烦,利用split按空格拆分字符串,把最后一个字符串转为StringBuilder,再从后往前不断append即可。
题目描述
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。标点符号和普通字母同等处理。例如,“student. a am I”,输出“I am a student.”。
Java实现:
/**
*
* @author ChopinXBP
* 翻转句子中的单词顺序。例如,“student. a am I”。
*/
public class ReverseSentence_42 {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println(ReverseSentence("I am a student."));
System.out.println(ReverseSentence(" "));
}
public static String ReverseSentence(String str) {
if(str == null || str == "")return "";
if(str == " ")return " ";
String[] strlist = str.split(" ");
int length = strlist.length - 1;
if(length < 0)return "";
StringBuilder newstr = new StringBuilder(strlist[length--]);
while(length >= 0) {
newstr.append(" ").append(strlist[length--]);
}
return newstr.toString();
}
}
C++实现示例:
class Solution {
public:
string ReverseSentence(string str) {
auto size = str.size();
if(size == 0) return "";
int mark=0;
str += ' ';
for(int i = 0; i < size+1; ++i){
if(str[i] == ' '){
ReverseWord(str, mark, i-1);
mark = i+1;
}
}
str = str.substr(0, size);
ReverseWord(str, 0, size-1);
return str;
}
void ReverseWord (string &str, int l, int r){
while(l < r){
swap(str[l], str[r]);
++l;
--r;
}
}
};
测试代码:
// ====================测试代码====================
void Test(char* testName, char* input, char* expectedResult)
{
if(testName != NULL)
printf("%s begins: ", testName);
ReverseSentence(input);
if((input == NULL && expectedResult == NULL)
|| (input != NULL && strcmp(input, expectedResult) == 0))
printf("Passed.\n\n");
else
printf("Failed.\n\n");
}
// 功能测试,句子中有多个单词
void Test1()
{
char input[] = "I am a student.";
char expected[] = "student. a am I";
Test("Test1", input, expected);
}
// 功能测试,句子中只有一个单词
void Test2()
{
char input[] = "Wonderful";
char expected[] = "Wonderful";
Test("Test2", input, expected);
}
// 鲁棒性测试
void Test3()
{
Test("Test3", NULL, NULL);
}
// 边界值测试,测试空字符串
void Test4()
{
Test("Test4", "", "");
}
// 边界值测试,字符串中只有空格
void Test5()
{
char input[] = " ";
char expected[] = " ";
Test("Test5", input, expected);
}
int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2();
Test3();
Test4();
Test5();
return 0;
}
#Coding一小时,Copying一秒钟。留个言点个赞呗,谢谢你#