重温算法,加深理解

简介: 算法在开发中的地位我们都很清楚,但是呢实际上项目里用到的算法并不是很多,虽然不是必须但是我们还是要懂算法,理解算法,运用算法。前几年肝了很多算法,但是这玩意不经常练习就会忘记,今天就重新把算法捡起来吧。

微信截图_20220531150008.png


前言


算法在开发中的地位我们都很清楚,但是呢实际上项目里用到的算法并不是很多,虽然不是必须但是我们还是要懂算法,理解算法,运用算法。前几年肝了很多算法,但是这玩意不经常练习就会忘记,今天就重新把算法捡起来吧。


一.题目,来源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));
}
复制代码

微信截图_20220531150037.png

小结


相信很多小伙伴在出去面试的过程中都遇到过算法题,但是不是所有的算法题都见过并实操过,要么就是有那么一点点印象,那这个时候怎么办呢,写解题思路,把能想到的都写上去。程序也好,算法也好,思想才是最重要的。

目录
相关文章
|
存储 算法
算法学习 | 加深了解算法的复杂度
本篇从时间复杂度和空间复杂度出发,深入了解一下算法的复杂性。
167 1
|
算法
重温算法之排序链表
这个题目有点麻烦,如果是使用的暴力法,会直接超时,使用自顶向下的归并排序的话,其实也没有多大的提升,目前是没有好的解决方案的,后期继续思考吧。
134 0
重温算法之排序链表
|
算法 测试技术
重温算法之括号生成
对于需要一直寻找到最终结果或者条件的题目,一般使用回溯算法,还有就是不要忽略题目的隐藏的一些点,如果忽略,可能某个测试用例就会报错,同时也要做判空处理。
102 0
重温算法之括号生成
|
算法
重温算法之有效的括号
这个题为什么借助栈会变得很容易呢,因为都是在利用栈先进先出的特点,然后匹配左右括号,如果只有其中之一则不满足,不满足的从栈里取出,剩下的就是满足条件的。
119 0
重温算法之有效的括号
|
算法
重温算法之单词搜索
对于回溯算法大家都不陌生,为此还有题友写成了回溯算法的模板,只要按模板套题都能灵活解题,算是开辟了一种做题的方式吧,有的算法题还是很磨人的。
141 0
重温算法之单词搜索
|
算法
重温算法之删除有序数组中的重复项
其实这个题用题友的双指针解法比较简洁而且效率更高,针对数据是有序,而且相同元素最多保留N位的问题可以使用此方案解题。
164 0
重温算法之删除有序数组中的重复项
|
算法
重温算法之颜色分类
可以看到题目已经有限制使用现有函数sort了,也就是很多时候我们在解题的时候会使用到现有的函数,算是偷懒了,这也是一个提醒,做题的时候一定要把题目审清楚,不然写完了才发现不对。
155 0
重温算法之颜色分类
|
存储 算法
重温算法之最长回文子串
关于回文的题目,核心思路还是依次比较,找到回文,然后进行其他的操作,另外官方题解中心扩散法也是一个最优解。
110 0
重温算法之最长回文子串
|
存储 算法 测试技术
重温算法之删除排序链表中的重复元素 II
解这道题时,我首先考虑的是遍历,后面感觉用遍历不太对,因为有一个测试用例总是通不过,后面看了官方题解才知道问题点在哪里,还有就是如果用递归的话比遍历要好容易理解。
115 0
重温算法之删除排序链表中的重复元素 II
|
算法
重温算法之三数之和
双指针的查找使用范围很广,也是必须掌握的一种解题方案,由上题比对我们也可以看到,在算法中要考虑到多种情况,如果遗漏掉某一些环节,就有可能发生异常,所以算法还是对思维严谨性要求比较高的,所谓失之毫厘差之千里。
128 0
重温算法之三数之和