百度、阿里、腾讯、京东等面试算法题

今天给大家分享的是字符串相关的算法面试题。现在进大厂,都会有算法面试题,不过因为算法和数据结构是有一定门槛的,所以想迈过这个门槛,慢慢积累然后反复看是一个可行的策略。


这个问题是Leetcode上的第151 道题:翻转字符串里的单词
图片

 

这道题目的解题思路:

  • 清除字符串中无用的空格, 【将 "  are you ok  " 整理成 “are you ok”

  • 然后将处理好的字符串进行翻转,【将 " are you ok " 整理成 “ko uoy era”】

  • 分别将每个单词进行翻转,【将ko变成ok , uoy变成you, 将 era变成are】

  • 最后结果就是 “ ok you are” 整理: 

             1. 清除空格

             2. 整个字符串翻转

             3. 然后每个单词进行翻转

 

目标1. 清除字符串中无用的空格 

swift 输入:s = " are you ok "

输出:"are you ok" 要求:这里面无用的空格包括最前面、中间以及最后位置上的空格

图片    

 

思路: 

        1.遍历字符串数组,如果不是" ",就加入到数组中
        2.如果是" ",要判断之前是否也为空,如果是的就跳过,如果不是就将" "加入到数组中。【 因为两个单词之间可能会存在多个空格,但是处理完之后,只能出现一个空格,因此需要判断之前是否也为空 】

 func clearSpace(str: String) -> [Character] {
        var chars = [Character]()
        var space = true
        for c in str {
            if c != " " {
                chars += "\(c)"
                space = false
            } else if space == false {
                chars += " "
                space = true
            }
        }
        return chars
    }

 

代码里面的space 的作用就是为了实现【思路2】的判断逻辑。我们就用

s = "  are   you ok "

 

为例过一遍代码。

  • 开始为 " ",所以什么都不做,继续执行直到遍历到'a'

  • c = a,所以加入到chars数组,并且space标记为false,(这样标记的意义是:当遍历到r的时候,我们根据space = false的值就知道上一个结束的时候不是空格)。继续执行直到遍历到'e'

  • 接下来c = " ",但是space = false,所以chars += " ",然后space标记为true;继续执行,此时c = " ",根据代码,是不执行任何操作。继续执行直到c = y,回到第一步。

 

这里比较重要的一点是 space 初时值为 true。

下面是java的实现代码:

public String clearSpace(String s) {
      if (s == null) return "";
        char[] chars = s.toCharArray();
    boolean space = true;
    for (int i = 0; i < chars.length; i++) {
        if (chars[i] != ' ') { // chars[i]是非空格字符
            chars[cur++] = chars[i];
            space = false;
        } else if (space == false) { // chars[i]是空格字符,chars[i - 1]是非空格字符
            chars[cur++] = ' ';
            space = true;
        }
    }
}

 

目标2. 翻转

这个很简单,代码如下:

func reverseString(_ chars: inout [Character], _ l: inout Int, _ r: inout Int) {
        r -= 1
        while l < r {
            let c = chars[l]
            chars[l] = chars[r]
            chars[r] = c
            l += 1
        }
    }

这段代码的意思就是将【 " are you ok " 整理成 “ko uoy era”】

 

 

整体实现:

class Solution {
    func reverseWords(_ s: String) -> String {
        var chars = [Character]()
        var space = true 
        for c in s {
            if c != " " {
                chars += "\(c)"
                space = false 
            } else if space == false {
                chars += " " 
                space = true 
            }
        }
        if space == true {
            chars.removeLast()
        }
        let count = chars.count
        reverseString(&chars, 0, count)
        var preIdx = -1
        for i in 0..<count {
            if chars[i] == " " {
                reverseString(&chars, preIdx+1, i)
                preIdx = i 
            }
        }
        reverseString(&chars, preIdx+1, count)
        var str = ""
        for c in chars {
            str += "\(c)"
        }
        return str
    }
 
    func reverseString(_ chars: inout [Character], _ l: Int, _ r: Int) {
        var b = l 
        var e = r - 1
        while b < e {
            let c = chars[b]
            chars[b] = chars[e]
            chars[e] = c
            b += 1
            e -= 1
        }
    }
}
 

总结:

今天我学到的解题思路就是一道算法题可以分解成子问题,然后处理完子问题后再组装一下,就能解出这道题。如果想通过面试,还是得靠做题,然后积累一些问题的解法。好了,今天就给大家分享这么多,希望能帮助到大家。

 

欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 添加关注,让我们一起共同成长!

posted on 2021-01-30 18:19  Wu_Candy  阅读(232)  评论(0编辑  收藏  举报