博客
关于我
L151. 翻转字符串里的单词
阅读量:235 次
发布时间:2019-02-28

本文共 2787 字,大约阅读时间需要 9 分钟。

  1. 翻转字符串里的单词
    给定一个字符串,逐个翻转字符串中的每个单词。

示例 1:

输入: “the sky is blue”

输出: “blue is sky the”
示例 2:

输入: " hello world! "

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

输入: “a good example”

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

说明:

无空格字符构成一个单词。

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

进阶:

请选用 C 语言的用户尝试使用 O(1) 额外空间复杂度的原地解法。

1.自己尝试的方法

明确一个方法,split(" "),如果碰到很多空格,不会把空格添加进去,而是添加空字符串,有几个空格就添加几个

class Solution {       public String reverseWords(String s) {           String st[] = s.split(" ");        int len = st.length;        StringBuilder sb = new StringBuilder();        for(int i = len -1; i >= 0; i--){               if(st.equals(" ")) continue;            sb.append(st[i]);            if(i > 0 )  sb.append(" ");        }        return sb.toString();    }}

有问题,对于末尾有多个空格的,if(i > 0 ) sb.append(" ");这个语句就会出问题,所以可以前后去空格

class Solution {           public String reverseWords(String s) {           String st[] = s.trim().split(" ");        int len = st.length;        StringBuilder sb = new StringBuilder();        for(int i = len -1; i >= 0; i--){               if(st[i].equals("")) continue;            sb.append(st[i]);            if(i > 0)  sb.append(" ");        }        return sb.toString();    }}

3.不用任何api,手动实现各个函数

先去除开头结尾空格,反转整个字符,再依次反转所有的单词

class Solution {       public static void main(String[] args) {           String s = "the sky is blue";        Solution ss = new Solution();        System.out.println(ss.reverseWords(s));    }    StringBuilder trim(String s){   //注意同时去除了中间多余的空格        int left = 0, right = s.length() - 1;        while(left <= right && s.charAt(left) == ' ') left++;        while(left <= right && s.charAt(right) == ' ') right--;        StringBuilder sb = new StringBuilder();        //注意要把字符间的空格去除        for(int k = left; k <= right; k++){               if(s.charAt(k) != ' ') sb.append(s.charAt(k));            else if(sb.charAt(sb.length() - 1) != ' ') sb.append(s.charAt(k));        }        return sb;    }    void reverse(StringBuilder sb, int left, int right){   //加上left ,right,方便指定范围反转        while(left < right){               //可以直接利用set来替换,不用转化为数组了            char tmp = sb.charAt(left);            sb.setCharAt(left++, sb.charAt(right));            sb.setCharAt(right--, tmp);        }    }    void reverseEach(StringBuilder sb){           int len = sb.length();        int start = 0, end= 0;        while(start < len){               while (end < len && sb.charAt(end) != ' ') end++;            reverse(sb, start, end - 1);            start = end + 1;            end++;        }    }    public String reverseWords(String s) {           StringBuilder sb = trim(s);//去除开头结尾空格        reverse(sb, 0, sb.length() - 1);//反转整个字符串        reverseEach(sb);        return sb.toString();    }}

转载地址:http://rpvp.baihongyu.com/

你可能感兴趣的文章
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>