java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词_第1张图片

解题思路
  1. 这道题,可以理解为,将字符串颠倒,但是每个单词原来的顺序是什么还是什么,不能改变单词的组合顺序,比如apple,able这个例子,字符串颠倒后为able,apple。整个字符串顺序颠倒了,但是apple和able这两个单词本身,不可以变化。
  2. 难点在于,每个单词中间的空格个数是不确定的,我们无法直接用split()等方法,直接按照空格为分隔符,将字符串分隔开来。会分隔出很多空字符串。
  3. 所以我们不以单个单词这样一个字符串作为单位进行反转,而是把整个字符串,转换为字符数组,进行判断
  1. 首先转换为字符数组: [ , , h, e, l, l, o, , w, o, r, l, d, , ]可以看到这个例子,有很多空字符串
  2. 然后我们先从左向右找到第一个非空字符[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  3. 然后继续向左找到第一个空格[ , , h, e, l, l, o,空格, w, o, r, l, d, , ]
  4. 此时我们就找到了第一个单词的左右下标[ , , h, e, l, l, o, , w, o, r, l, d, , ]
  5. 将其插入新的数组中[w, o, r, l, d, , ],这样就完成了第一个单词的反转工作,也就是将最后一个单词放到第一个位置,然后单词不进行变化
  6. 然后重复上面的步骤,直到所有单词处理完成
代码

java数据结构与算法刷题-----LeetCode151. 反转字符串中的单词_第2张图片

class Solution {
    public String reverseWords(String s) {
        char[] arr = s.toCharArray();//获取字符数组
        char[] newArr = new char[s.length()+1];//保存反转字符串的数组
        int index = 0;//newArr的下标,代表插入位置
        int i = s.length()-1;//我们从后往前遍历,将后面的元素,依次插入到newArr的前面,就实现了反转
        while(i >= 0){//只要还有元素可以遍历就继续
            while(i >= 0 && arr[i] == ' ') i--;//向左找到第一个非空格字符
            int right = i;//让right指向它,代表它是当前单词的最后一个字母位置
            while(i >= 0 && arr[i] != ' ') i--;//继续向左找第一个空格A
            for(int j = i + 1; j <= right; j++){//那么这个A空格,右边第一个字符,就是这个单词的起始位置
                newArr[index++] = arr[j];//将这个单词插入newArr
                if(j == right){//如果插入完成
                    newArr[index++] = ' ';//补上一个空格,分隔开来
                }
            }
        }
        if(index == 0){//如果没插入过字母,就返回空串
            return "";
        }
        return new String(newArr, 0, index-1);//返回答案
    }
}

你可能感兴趣的:(算法,java,算法,leetcode)