如何免费建企业网站,东莞网站建设公司电话,企业网站建设的要素有哪些,便捷网站建设多少钱文章目录 题目补充知识ArrayList动态数组StringBuilder类 解①穷举法②穷举法改进③双指针 题目
给你一个字符串 s #xff0c;请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单… 文章目录 题目补充知识ArrayList动态数组StringBuilder类 解①穷举法②穷举法改进③双指针 题目
给你一个字符串 s 请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
**注意**输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中单词间应当仅用单个空格分隔且不包含任何额外的空格。
示例 1
输入s the sky is blue
输出blue is sky the示例 2
输入s hello world
输出world hello
解释反转后的字符串中不能存在前导空格和尾随空格。补充知识
ArrayList动态数组
ArrayList的基本使用方式 导入ArrayList类 import java.util.ArrayList;创建ArrayList对象 ArrayListString list new ArrayList();添加元素到ArrayList中 list.add(Element1);获取ArrayList中的元素 String element list.get(index);修改ArrayList中的元素 list.set(index, newValue);删除ArrayList中的元素 list.remove(index);获取ArrayList的大小 int size list.size();检查ArrayList是否为空 boolean isEmpty list.isEmpty();遍历ArrayList 使用for循环 for (int i 0; i list.size(); i) {String element list.get(i);
}使用增强型for循环 for (String element : list) {}检查ArrayList是否包含某个元素 boolean containsElement list.contains(Element1);清空ArrayList list.clear();转换为数组 String[] array list.toArray(new String[0]);StringBuilder类
常用方法 append(): 在字符串构建器的末尾追加字符串、字符或其他数据。 StringBuilder sb new StringBuilder();
sb.append(Hello);
sb.append( );
sb.append(world);insert(): 在指定位置插入字符串、字符或其他数据。 StringBuilder sb new StringBuilder(Hello world);
sb.insert(5, , ); // Hello, worlddelete(): 删除从指定位置开始到指定位置结束之间的字符前闭后开包括开始位置不包括结束位置。 StringBuilder sb new StringBuilder(Hello world);
sb.delete(5, 11); // 删除 world 变成 HellodeleteCharAt(): 删除指定位置的字符。 StringBuilder sb new StringBuilder(Hello world);
sb.deleteCharAt(5); // 删除空格replace(): 用指定字符串替换从指定开始索引到指定结束索引之间的字符。 StringBuilder sb new StringBuilder(Hello world);
sb.replace(6, 11, Java); // 替换 world 为 Javasubstring(): 返回从指定开始索引到指定结束索引之间的子字符串。 StringBuilder sb new StringBuilder(Hello world);
String sub sb.substring(6, 11); // 获取 worldreverse(): 反转字符串。 StringBuilder sb new StringBuilder(Hello);
sb.reverse(); // 变为 olleHcharAt(): 返回指定索引处的字符。 cStringBuilder sb new StringBuilder(Hello);
char c sb.charAt(1); // 获取索引为1的字符 elength(): 返回字符串的长度。 StringBuilder sb new StringBuilder(Hello);
int length sb.length(); // 返回5indexOf() / lastIndexOf(): 返回指定字符串或字符在字符串构建器中第一次出现的索引或最后一次出现的索引。 StringBuilder sb new StringBuilder(Hello world);
int index1 sb.indexOf(o); // 返回4
int index2 sb.lastIndexOf(o); // 返回7toString(): 将字符串构建器转换为普通的字符串。 StringBuilder sb new StringBuilder(Hello world);
String str sb.toString(); // 返回 Hello world解
①穷举法
11ms超过11%
设置了一个动态数组遍历s判断当前元素和上一个元素是否为空
上一个元素为空当前不是空的时候记录单词的起始位置
上一个元素不为空当前为空的时候将单词加入到动态数组当中
如果是s的最后一个元素需要判断是否是空格如果不是空格的话要将最后一个单词加入到动态数组
最后倒着遍历整个动态数组存入到字符串end
import java.util.ArrayList;
class Solution {public String reverseWords(String s) {boolean curfalse;boolean lasttrue;//上一个是否是空String endnew String();int start0;ArrayListString strsnew ArrayListString();for(int i0;is.length();i){char elements.charAt(i);cur(element )?true:false;last(i!0 s.charAt(i-1) )?true:false;if(last !cur){//如果上一个是空格当前不是空格//则记录开始的位置starti;}if(i!0 !last cur){//如果上一个不是空格这一个是空格String strs.substring(start,i);strs.add(str);}if(is.length()-1 !cur){// 如果是最后一个也要考虑一下最后一个不是空格的情况~String strs.substring(start,i1);strs.add(str);} }System.out.print(strs.get(0)/);for(int istrs.size()-1;i0;i--){endstrs.get(i);if(i!0){end ;}}return end;}
}②穷举法改进
7ms超过42.8%
①当中的end从String类型改成StringBuilder类型
import java.util.ArrayList;
class Solution {public String reverseWords(String s) {boolean curfalse;boolean lasttrue;//上一个是否是空StringBuilder endnew StringBuilder();int start0;ArrayListString strsnew ArrayListString();for(int i0;is.length();i){char elements.charAt(i);cur(element )?true:false;last(i!0 s.charAt(i-1) )?true:false;if(last !cur){//如果上一个是空格当前不是空格//则记录开始的位置starti;}if(i!0 !last cur){//如果上一个不是空格这一个是空格String strs.substring(start,i);strs.add(str);}if(is.length()-1 !cur){// 如果是最后一个也要考虑一下最后一个不是空格的情况~String strs.substring(start,i1);strs.add(str);} }for(int istrs.size()-1;i0;i--){end.append(strs.get(i));if(i!0){end.append( );}}return end.toString();}
}③双指针
4ms81.48%
参考leetcode-Krahets
通过string类的trim函数可以去除字符串的首尾空格主要是没有想到用while的方式完成代码实际上①②都有点类似双指针的解法都是找到了单词的首尾然后进行记录当前代码和之前不同的地方在于没有使用动态数组直接将单词保存在StringBuilder当中并且采用的是从后向前读取不需要考虑翻转问题。直接保存到StringBuilder是个挺好的想法本来想尝试修改②的代码突然发现是正序的如果修改的话会比较麻烦遂放弃
import java.util.ArrayList;
class Solution {public String reverseWords(String s) {ss.trim();//去除首尾空格StringBuilder strsnew StringBuilder();int js.length()-1,ij;//初始ij都在字符串末尾的地方while(i0){while(i0 s.charAt(i)! ) i--;//跳过不是空格的元素strs.append(s.substring(i1,j1) );//遇到空格则添加元素到strs按照题目要求单词之间空格隔开while(i0 s.charAt(i) ) i--;//跳过两个单词之间的空格ji;//定位到下一个单词的末尾处}return strs.toString().trim();//添加元素的时候每个元素后面都增加了 ,这里需要删除一下 }
}