LeetCode每日1题--翻转字符串里的单词

简介: LeetCode每日1题--翻转字符串里的单词

前言


算法的重要性不言而喻!区分度高!

现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。

说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!

提前入门学习书籍:CPrimerPlus、大话数据结构

image.png


刷题网站


代码随想录 (programmercarl.com)

leetcode

我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以

刷题嘛,最重要的就是坚持了!!!


画图软件


OneNote

这个要经常用,遇见不懂的流程的话就拿它画一画!


笔记软件


Typoral


题目


image.png


解析


使用语言的特性


这里采用Leecode上官方的解法,官方给的图很清晰,而且也很好理解。这里我们做一个简单的了解即可,因为这种方式是调用API来完成,并不是能达到锻炼我们操作字符串的能力!

Java中提供了对字符串的split、reverse、join等方法,我们可以直接调用API来完成操作:

  1. 首先用split按空格分割字符串数组

image.png

2.在使用reverse把字符串数组进行反转

  1. 最后使用join将字符串数组拼成字符串

image.png

完整代码如下:


class Solution {
    public String reverseWords(String s) {
        s = s.trim();
        List<String> wordList = Arrays.asList(s.split("\s+"));
        Collections.reverse(wordList);
        return String.join(" ", wordList);
    }
}


编写函数完成


这道题我们当然要自己来编写函数来解啊,这才能得到锻炼

思路还是一样的:

  1. 去除首尾以及中间多余空格
  2. 反转整个字符串
  3. 反转单词

去除首尾以及中间多余空格


private StringBuilder removeSpace(String s) {
    int start = 0;
    int end = s.length() - 1;
    while (s.charAt(start) == ' ') start++;
    while (s.charAt(end) == ' ') end--;
    //上面这两步就完成了对首尾空格的去除
    StringBuilder sb = new StringBuilder();
    while (start <= end) {
        char c = s.charAt(start);
        if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
            sb.append(c);
        }
        start++;
    }
    return sb;
}

反转整个字符串

这里利用了StringBuilder直接交换单词顺序

经过反转字符串,单词的顺序还是反着的,所以我们还需要再写一个方法来做字母的反转


public void reverseString(StringBuilder sb, int start, int end) {
    while (start < end) {
        char temp = sb.charAt(start);
        sb.setCharAt(start, sb.charAt(end));
        sb.setCharAt(end, temp);
        start++;
        end--;
    }
}

反转字母

字母的反转我们也可以用上面字符串反转的方法,对每一组字符串都进行反转就可得到最终的反转结果


private void reverseEachWord(StringBuilder sb) {
    int start = 0;
    int end = 1;
    int n = sb.length();
    while (start < n) {
        //            对空格不进行反转,选择跳过
        while (end < n && sb.charAt(end) != ' ') {
            end++;
        }
        //对字母进行再次反转
        //这里的end-1是因为end的索引是从1开始的,不减1到后面会越界
        reverseString(sb, start, end - 1);
        /**
             * 注意这里是意思是反转完第一组单词后,进行第二组单词的反转
             * 此时要给start指针和end指针重新赋值,start指针的赋值为end+1,也就是跳过了空字符串的情况
             * 上一步经过反转的end指针的位置是end-1
             */
        start = end + 1;
        end = start + 1;
    }
}

完整代码如下


package com.caq.string;
import java.util.Arrays;
public class ReverseString3 {
    public static void main(String[] args) {
        String s = "hello  world !  ";
        ReverseString3 re = new ReverseString3();
        String s3 = re.reverseWors(s);
        System.out.println(s3);
    }
    /**
     * 1.去除首尾以及中间多余空格
     * 2.反转整个字符串
     * 3.反转单词
     */
    public String reverseWors(String s) {
        // 1.去除首尾以及中间多余空格
        StringBuilder sb = removeSpace(s);
        // 2.反转整个字符串
        reverseString(sb, 0, sb.length() - 1);
        // 3.反转各个单词
        reverseEachWord(sb);
        return sb.toString();
    }
    /**
     * 移除空格
     *
     * @param s
     * @return
     */
    private StringBuilder removeSpace(String s) {
        int start = 0;
        int end = s.length() - 1;
        while (s.charAt(start) == ' ') start++;
        while (s.charAt(end) == ' ') end--;
        StringBuilder sb = new StringBuilder();
        while (start <= end) {
            char c = s.charAt(start);
            if (c != ' ' || sb.charAt(sb.length() - 1) != ' ') {
                sb.append(c);
            }
            start++;
        }
        return sb;
    }
    /**
     * 反转字符串
     * 反转数组就是最基本的双指针
     * 这里反转字符串借助StringBuilder完成
     */
    public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));
            sb.setCharAt(end, temp);
            start++;
            end--;
        }
    }
    /**
     * 反转字母
     * 怎么反转的呢,一组一组的去反转
     *
     * @param sb
     */
    private void reverseEachWord(StringBuilder sb) {
        int start = 0;
        int end = 1;
        int n = sb.length();
        while (start < n) {
//            对空格不进行反转,选择跳过
            while (end < n && sb.charAt(end) != ' ') {
                end++;
            }
            //对字母进行再次反转
            //这里的end-1是因为end的索引是从1开始的,不减1到后面会越界
            reverseString(sb, start, end - 1);
            /**
             * 注意这里是意思是反转完第一组单词后,进行第二组单词的反转
             * 此时要给start指针和end指针重新赋值,start指针的赋值为end+1,也就是跳过了空字符串的情况
             * 上一步经过反转的end指针的位置是end-1
             */
            start = end + 1;
            end = start + 1;
        }
    }
}



相关文章
|
6天前
|
存储 算法 安全
【刷题】 leetcode 面试题 01.06 字符串压缩
来看效果: 非常好!!!过啦!!!
27 5
【刷题】 leetcode 面试题 01.06 字符串压缩
|
6天前
leetcode代码记录(翻转二叉树
leetcode代码记录(翻转二叉树
8 0
|
6天前
leetcode代码记录(删除字符串中的所有相邻重复项
leetcode代码记录(删除字符串中的所有相邻重复项
12 0
|
6天前
|
算法
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
代码随想录算法训练营第五十五天 | LeetCode 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结
25 1
|
6天前
|
存储 编译器 Linux
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
标准库中的string类(中)+仅仅反转字母+字符串中的第一个唯一字符+字符串相加——“C++”“Leetcode每日一题”
|
6天前
|
机器学习/深度学习 索引
【力扣】387. 字符串中的第一个唯一字符
【力扣】387. 字符串中的第一个唯一字符
|
6天前
|
存储
leetcode2744. 最大字符串配对数目
leetcode2744. 最大字符串配对数目
18 0
|
6天前
|
机器学习/深度学习 NoSQL Shell
力扣刷题-翻转字符串
力扣刷题-翻转字符串
12 1
|
6天前
|
机器学习/深度学习 人工智能 算法
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)
LeetCode刷题--- 面试题 01.07. 旋转矩阵(原地旋转+翻转替旋转)