• 剑指 Offer 58


    Markdown在线编辑器 - www.MdEditor.com

    剑指 Offer 58 - I. 翻转单词顺序

    题目链接:

    题目描述

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

    示例 1:

    1. 输入: "the sky is blue"
    2. 输出: "blue is sky the"

    示例 2:

    1. 输入: " hello world! "
    2. 输出: "world! hello"
    3. 解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。

    示例 3:

    1. 输入: "a good example"
    2. 输出: "example good a"
    3. 解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    说明:

    无空格字符构成一个单词。
    输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    思路分析

    思路一

    1.反序字符串 hello world-》dlrow olleh
    2.再对每个单词进行正序 dlrow olleh -》world hello
    说明:以上步骤仅对 首尾无多余空格,相邻单词仅一个空格输入有效, 对于多出来的空格代码里有具体解决方案
    待补充

    代码结构设计

    1.整个句子的首尾标记,交换后向中间靠拢直到相遇
    2.单词的首位标记,初始 Wbeg Wend指向dlrow的d,Wbeg向后遍历
    遇到普通字符,Wbeg++
    遇到空格,确定单词范围(Wend,Wbeg-1),对范围单词反向;Wbeg=Wbeg+1,Wend=Wbeg.移到下单词
    或者遇到’’,确定单词范围(Wend,Wbeg-1),对范围单词反向;结束

    代码具体实现

    1. class Solution {
    2. public:
    3. //由于反序整个字符串和整个单词用的用同一个功能所以提取出公共函数
    4. void Reverse(string &s, int start, int end) {
    5. while(start < end) {
    6. char tmp = s[start];
    7. s[start++] = s[end];
    8. s[end--] = tmp;
    9. }
    10. }
    11.  
    12. string reverseWords(string s) {
    13. Reverse(s, 0, s.length()-1); // 1
    14. // 2
    15. int Wbeg = 0, Wend = 0;
    16. while(1) {
    17. if(s[Wbeg] == ' ') {
    18. Reverse(s, Wend, Wbeg-1);
    19. Wbeg++;
    20. Wend = Wbeg;
    21. }else if(s[Wbeg] == '') {
    22. Reverse(s, Wend, Wbeg-1);
    23. break;
    24. }else {
    25. Wbeg++;
    26. }
    27. }
    28. //之后是对题目描述中说明的多余空格的处理
    29. //去除空格,多余空格 首尾空格 俩单词间仅一个空格
    30. istringstream ss(s);
    31. string tmp_str, result;
    32. while(ss >> tmp_str) {
    33. result += tmp_str;
    34. result += " ";
    35. }
    36. //最后多一个空格所以就删去最后一位前移
    37. if(result != "")//对于为空的字符串就什么也不做
    38. result[result.length() - 1] = '';
    39. return result;
    40. }
    41. };
  • 相关阅读:
    Luogu 2254 [NOI2005]瑰丽华尔兹
    Luogu 3168 [CQOI2015]任务查询系统
    Luogu U15118 萨塔尼亚的期末考试(fail)
    POJ 2778 DNA Sequence AC自动机 + 矩阵快速幂
    HDU 2457 DNA repair AC自动机 + dp
    POJ 3522 Slim Span 暴力枚举 + 并查集
    POJ 2955 Brackets 区间dp
    hdu 2604 Queuing dp找规律 然后矩阵快速幂。坑!!
    UESTC
    java & SQL
  • 原文地址:https://www.cnblogs.com/linxuesong/p/13173603.html
Copyright © 2020-2023  润新知