#数据结构与算法学习笔记#剑指Offer42:翻转单词顺序列 + 测试用例(Java、C/C++)

234 篇文章 1 订阅
80 篇文章 0 订阅

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一秒钟。留个言点个赞呗,谢谢你#

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值