zoukankan      html  css  js  c++  java
  • 剑指offer系列——44.翻转单词顺序列/翻转字符串里的单词

    Q:牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?
    A:熟练运用reverse函数

        string ReverseSentence(string str) {
            if (str.empty())
                return str;
            int index1 = 0;
            int index2 = 0;
            reverse(str.begin(), str.end());
            while (index1 < str.size()) {
                while (str[index2] != ' ' && index2 < str.size())
                    index2++;
                reverse(str.begin() + index1, str.begin() + index2);
                index2++;
                index1 = index2;
            }
            return str;
        }
    

    Q:给定一个字符串,逐个翻转字符串中的每个单词。

    示例 1:
    输入: "the sky is blue"
    输出: "blue is sky the"
    示例 2:
    输入: "  hello world!  "
    输出: "world! hello"
    解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    示例 3:
    输入: "a good   example"
    输出: "example good a"
    解释: 如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。
     
    说明:
    无空格字符构成一个单词。
    输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。
    如果两个单词间有多余的空格,将反转后单词间的空格减少到只含一个。

    A:
    各种库函数齐上阵

        public String reverseWords(String s) {
            if (s.isEmpty())
                return "";
            String[] str = s.split(" ");//可能有“”
            ArrayList<String> array = new ArrayList<>();
            for (String sub : str) {
                if (!sub.isEmpty())
                    array.add(sub);
            }
            Collections.reverse(array);
            return String.join(" ", array);
        }
    

    但调用了API,有点对不起这中等难度啊
    纯手写API:

        public String reverseWords(String s) {
            if (s.isEmpty())
                return "";
            int slow = 0;
            int fast = slow;
            Stack<String> stack = new Stack<>();
            while (slow != s.length()) {
                if (s.charAt(slow) == ' ') {
                    slow++;
                    continue;
                } else {
                    fast = slow + 1;
                    while (fast < s.length() && s.charAt(fast) != ' ') {
                        fast++;
                    }
                    stack.push(s.substring(slow, fast));
                    slow = fast;
                }
            }
            StringBuilder stringBuilder = new StringBuilder();
            if(stack.empty())
                return "";
            stringBuilder.append(stack.pop());
            while(!stack.empty()){
                stringBuilder.append(" ");
                stringBuilder.append(stack.pop());
            }
            return stringBuilder.toString();
        }
    
  • 相关阅读:
    设计模式之装饰模式
    SpringAOP 失效解决方案、Spring事务失效
    Jmeter测试出现端口占用情况
    ElasticSearch创建动态索引
    Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
    TCP的三次握手与四次挥手笔记
    Java中的阻塞队列
    Jmeter5.1——聚合报告参数分析
    SpringCloud"灰度部署"——动态刷新网关配置
    JVM学习笔记——类加载过程
  • 原文地址:https://www.cnblogs.com/xym4869/p/12336362.html
Copyright © 2011-2022 走看看