反转字符串里面的单词 Posted on 2021-07-21 00:00:00 2021-07-21 00:00:00 by Author 摘要 给定一个字符串,你能逐个翻转字符串中的每个单词吗????。 # 反转字符串里面的单词 > 写于2021/06/01 1. 题目描述 - 给定一个字符串,逐个翻转字符串中的每个单词。 2. 示例描述 - 示例一: - 输入:"the sky is blue" - 输出:"blue is sky the" - 示例二: - 输入:"hello word! old ke" - 输出:"ke old word! hello" 3. 解题思路 - 首先这道题有种简单得方法,就是给定一个字符串,我们以空格得形式截取字符串,形成字符串数组,然后用逆向得形式把字符数组在拼接起来,就能解决这道题目。假如这样做,那么做这道题就没有意义了。 - 所以这道题目得意图就是让我们原地逆转字符串里面得单词,这就有点难度了。那么怎么解决尼。首先我们知道所给定得字符串不是规范的(即就是每个单词之间有可能不是以一个空格隔开,或者字符串首部或者尾部都有空格),所以前提就是把所给的字符串整理成我们想要的规范形式,然后找出每个单词,每个单词反转一遍,然后再把整理后的整个字符串反转一遍就能解决这道题,这也是出这道题的本意。详细步骤解释,见如下代码,每个步骤都有详细的注释。 4. 代码实现 ```java //移除多余的空格的方法 public String removeExtractSpaces(String s) { //定义一个快慢指针 int slowIndex = 0, fastIndex = 0; //把字符串转化为字符数组,便于的操作与处理 char[] chars = s.toCharArray(); //去掉字符串前面的空格,fastIndex定位到字符串第一个不为空格的字符下标的位置 while (s.length() > 0 && fastIndex < s.length() && chars[fastIndex] == ' ') { fastIndex++; } //移动字符,使字符串转化为我们想要的形式(即为每个单词后面空一格) for (; fastIndex < s.length(); fastIndex++) { //如果中间单词之间有多个空格,那么找到下一个单词开头的下标位置 if (fastIndex - 1 > 0 && chars[fastIndex - 1] == chars[fastIndex] && chars[fastIndex] == ' ') { continue; } //去除多余的空格 else { chars[slowIndex++] = chars[fastIndex]; } } //如果字符串末尾有空格,则去除末尾的空格(及就是把字符数组长度减一,也相当于去除末尾的空格) int end = 0; if (slowIndex - 1 > 0 && chars[slowIndex - 1] == ' ') { //end及就是去除多余空格后字符数组的长度 end = slowIndex - 1; } else { end = slowIndex; } //返回去除多余空格后的结果 String result1 = ""; for (int i = 0; i < end; i++) { result1 += chars[i]; } return result1; } public String reverseWords(String s) { //定义一个最终结果变量 String result = ""; //去除多余空格 String s1 = removeExtractSpaces(s); char[] chars = s1.toCharArray(); int start = 0, i = 0; for (i = 0; i < chars.length; i++) { //如果前一个字符不可为空,而当前为空 if (i > 0 && chars[i - 1] != ' ' && chars[i] == ' ') { //reverse word from start to i-1 //反转单词,从下标为start到i-1的位置(这里start就是单词开始的位置,i-1即为单词结束的下标位置) //为什么是i-1尼,因为在if判断的时候,当前为为空格,所以前一个字符为单词末尾的位置 int end = i - 1; //反转单词的操作 while (start < end) { char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; start++; end--; } } //如果前一个字符为空,当前字符不为空,说明,单词开始了 if (i > 0 && chars[i - 1] == ' ' && chars[i] != ' ') { //记录单词首位的位置 start = i; } } //由于最后i已经不满足循环条件,并且最后一个单词没有反转 //所以这个判断就是反转字符串中最后一个单词的操作 if (i >= chars.length) { //字符串长度为end,则最后一个下标的位置为end-1 int end = i - 1; //反转最后一个单词的操作 while (start < end) { char temp = chars[start]; chars[start] = chars[end]; chars[end] = temp; start++; end--; } } //反转整个字符串数组 //首位下标为0,末尾下标为end-1 int start1 = 0, end = i - 1; while (start1 < end) { char temp = chars[start1]; chars[start1] = chars[end]; chars[end] = temp; start1++; end--; } //把字符数组组装成最后的结果返回调用改方法的地方 for (int i1 = 0; i1 <= i - 1; i1++) { result += chars[i1]; } //返回结果 return result; } ```
{{ item.content }}
{{ child.content }}