持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第12天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
使用语言的特性
这里采用Leecode上官方的解法,官方给的图很清晰,而且也很好理解。这里我们做一个简单的了解即可,因为这种方式是调用API来完成,并不是能达到锻炼我们操作字符串的能力!
Java中提供了对字符串的split、reverse、join等方法,我们可以直接调用API来完成操作:
- 首先用split
按空格分割字符串数组
2.在使用reverse把字符串数组进行反转
- 最后使用join将字符串数组拼成字符串
完整代码如下:
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);
}
}
编写函数完成
这道题我们当然要自己来编写函数来解啊,这才能得到锻炼
思路还是一样的:
- 去除首尾以及中间多余空格
- 反转整个字符串
- 反转单词
去除首尾以及中间多余空格
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;
}
}
}