这是悦乐书的第259次更新,第272篇原创

01 看题和准备

今天介绍的是LeetCode算法题中Easy级别的第126题(顺位题号是557)。给定一个字符串,您需要反转句子中每个单词中的字符顺序,同时仍保留空格和初始单词顺序。例如:

输入:“Let's take LeetCode contest”
输出:“s'teL ekat edoCteeL tsetnoc”

注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格。

本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

02 第一种解法

将s按照空格拆分为字符串数组,然后对数组中的每一个元素做翻转,再以空格拼接,作为结果返回。

public String reverseWords(String s) {
    String[] arr = s.split(" ");
    StringBuilder result = new StringBuilder();
    for (int i=0; i<arr.length; i++) {
        String ss = arr[i];
        StringBuilder sb = new StringBuilder(ss);
        sb.reverse();
        arr[i] = sb.toString();
        if (i == arr.length-1) {
            result.append(arr[i]);
        } else {
            result.append(arr[i]+" ");
        }
    }
    return result.toString();
}


03 第二种解法

对于第一种解法我们还可以再优化下。

public String reverseWords2(String s) {
    String[] arr = s.split(" ");
    StringBuilder result = new StringBuilder();
    for (String ss : arr) {
        result.append(new StringBuilder(ss).reverse().toString()+" ");
    }
    return result.toString().trim();
}


04 第三种解法

我们也可以直接在字符串内部进行操作。将以空格分割开的单个单词为一个对象,对其中的字符进行互换。先将s转为字符数组,如果当前字符不为空格,索引就继续向后移动,直到遇到空格为止,此时我们获取了第一个单词组成的字符的起始索引,再使用一次循环,将其字符进行反转,然后将索引还原。最后将字符数组转为字符串返回即可。

public String reverseWords3(String s) {
    char[] arr = s.toCharArray();
    for (int i=0; i<arr.length; i++) {
        if (arr[i] != ' ') {
            int j = i;
            while (i<arr.length && arr[i] != ' ') {
                i++;
            }
            i--;
            int index = i;
            while (j < i) {
                char temp = arr[j];
                arr[j] = arr[i];
                arr[i] = temp;
                j++;
                i--;
            }
            i = index;
        }
    }
    return new String(arr);
}


05 小结

算法专题目前已日更超过三个月,算法题文章126+篇,公众号对话框回复【数据结构与算法】、【算法】、【数据结构】中的任一关键词,获取系列文章合集。

以上就是全部内容,如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

内容来源于网络如有侵权请私信删除
你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!