前言
算法在开发中的地位我们都很清楚,但是呢实际上项目里用到的算法并不是很多,虽然不是必须但是我们还是要懂算法,理解算法,运用算法。前几年肝了很多算法,但是这玩意不经常练习就会忘记,今天就重新把算法捡起来吧。
一.题目,来源LeetCode第557题
给定一个字符串,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例和要求:
输入: “Let’s take LeetCode contest”
输出: “s’teL ekat edoCteeL tsetnoc”
注意:在字符串中,每个单词由单个空格分隔,并且字符串中不会有任何额外的空格
二.解题思路
题目里的关键字是反转,反转的就是把首和尾调换,看到题目第一眼我的想法是首先以空格为分割点截取到单词,然后找到该首和尾,并标记首和尾,然后就在循环中逐步调换位置,对于下一个词也使用类似的方法,当然还要注意题目中说的仍保留空格和单词的初始顺序,怎么去保证其顺序呢,标记好空格的位置即可,下面我们来看看具体的实现。
三.解题
1.粗暴法,比较笨拙,也可以看出里面使用了两次循环,并不是最优解
public static String reverseWords_1(String s) { char[] chArray = s.toCharArray(); int nextWordStart = 0; while (nextWordStart < chArray.length) { // 找到每个单词的首尾 int start = nextWordStart; int end = start; //找到每个单词的末尾 while (end < chArray.length && chArray[end] != ' ') { end++; } //这里end - 1单词的为最后一个 end--; int currentWordEnd = end; // 翻转单词 即循环替换位置 while (start < end) { char temp = chArray[start]; chArray[start] = chArray[end]; chArray[end] = temp; start++; end--; } //判断空格:currentWordEnd + 1 是空格, + 2 是空格下一个单词 nextWordStart = currentWordEnd + 2; } return new String(chArray); } 复制代码
2.简单法,先将字符串按空格分割,然后使用现有reverse()反转,这种方法算是偷懒吧
public String reverseWords_2(String s) { String words[] = s.split(" "); StringBuilder sb=new StringBuilder(); for (String word: words) //reverse() 反转元素的顺序 sb.append(new StringBuffer(word).reverse().toString() + " "); return sb.toString().trim(); } 复制代码
3.执行结果
public static void main(String[] args) { String s = "Let's take LeetCode contest"; System.out.println(reverseWords(s)); } 复制代码
小结
相信很多小伙伴在出去面试的过程中都遇到过算法题,但是不是所有的算法题都见过并实操过,要么就是有那么一点点印象,那这个时候怎么办呢,写解题思路,把能想到的都写上去。程序也好,算法也好,思想才是最重要的。