【每日一题】【去除多余空格】【字符串修改】2021年12月21日-151. 翻转字符串里的单词
给你一个字符串 s ,逐个翻转字符串中的所有 单词 。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
请你返回一个翻转 s 中单词顺序并用单个空格相连的字符串。
说明:
输入字符串 s 可以在前面、后面或者单词间包含多余的空格。
翻转后单词间应当仅用一个空格分隔。
翻转后的字符串中不应包含额外的空格。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-words-in-a-string
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

方法:库函数or手写
//库函数Collections.reverse数组,String.join(" ", words); //反转所有,反转单词,去除空格s.trim() class Solution { public String reverseWords(String s) { String[] arr = s.trim().split(" +"); //正则表达式 Collections.reverse(Arrays.asList(arr)); return String.join(" ", arr); } } //手写方法,注意:变动字符串元素,需要传递字符数组,并且无返回值! class Solution { public String reverseWords(String s) { if(s.length() == 0 || s == null) { return s; } //整体反转 char[] arr = s.toCharArray(); reverse(arr, 0, arr.length - 1); //每个单词反转,☆ reverseWord(arr); //移除多余空格 return replace(arr); } /** 整体反转 */ public void reverse(char[] arr, int m, int n) { //注意循环条件 while(m < n) { arr[m] ^= arr[n]; arr[n] ^= arr[m]; arr[m] ^= arr[n]; m++; n--; } } /** 每个单词反转 */ public void reverseWord(char[] arr) { int n = arr.length; int i = 0, j = 0; while(j < n) { while(i < n && arr[i] == ' ') { i++; } j = i;//注意移动j的位置 while(j < n && arr[j] != ' ') { j++; } reverse(arr, i, j - 1); i = j; //注意:最后要改变i的值 } } /** 移除多余空格,☆ 类似于双指针 */ public String replace(char[] arr) { int n = arr.length; int i = 0, j = 0; while(j < n) { while(j < n && arr[j] == ' ') { j++; } while(j < n && arr[j] != ' ') { arr[i++] = arr[j++]; } while(j < n && arr[j] == ' ') { j++; } //注意最后加空格 if(j < n) { arr[i++] = ' '; } } return new String(arr).substring(0, i);//注意:不再是原来的数组 } }
本文来自博客园,作者:哥们要飞,转载请注明原文链接:https://www.cnblogs.com/liujinhui/p/15717101.html

浙公网安备 33010602011771号