代码随想录算法训练营第九天| 151.翻转字符串里的单词、55.右旋转字符串 、字符串总结
151.翻转字符串里的单词
初始思路:先遍历一遍,统计字符串中单词加上空格的长度。然后设立一个指针,指向旧字符串的最后一个,倒着把旧字符串复制到新字符串中(复制的时候遇到空格只复制一个,同时去掉前后的空格),然后用双指针法把新字符串中的单词正过来(一个指针指向单词的第一个,另一个一直遍历到下一个位置是空格或者是字符串的最后一个位置)。
class Solution {public String reverseWords(String s) {StringBuilder sb = removeSpace(s);reverseString(sb, 0,sb.length()-1);reverseEachWords(sb);return sb.toString();}StringBuilder removeSpace(String s){//先去除首尾空格int left = 0;int right = s.length() - 1;while(s.charAt(left) == ' ') left++;while(s.charAt(right) == ' ') right--;StringBuilder sb = new StringBuilder();//存放最后处理好的字符串//去除中间空格while(left <= right){//从头到尾遍历,要包括等于,因为最后一个单词也要转移char c = s.charAt(left);if(c != ' ' || sb.charAt(sb.length() - 1) != ' '){//若当前不是空格 或 当前是空格但是新字符串的前一个不是空格sb.append(c);}left++;}return sb;}void reverseString(StringBuilder sb, int left, int right){while(left < right){char temp = sb.charAt(left);sb.setCharAt(left, sb.charAt(right));sb.setCharAt(right, temp);left++;right--;}}void reverseEachWords(StringBuilder sb){int left = 0;int right = 1;int length = sb.length();while(right<length){while(right < length && sb.charAt(right) != ' '){right++;}reverseString(sb,left,right-1);left = right+1;right = left +1;}}
}
55.右旋转字符串
思路:先把字符串整体逆置,再把前n个逆置,再把剩余的逆置。
字符串总结
面试的时候可能分析时间复杂度,这时候需要属性常见库函数的时间复杂度;
写代码的时候,一些常见的方法和常用类要熟记。
鉴于作者水平有限,文章可能存在错误
如有指正,十分感谢