本文共 2802 字,大约阅读时间需要 9 分钟。
示例 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/