zoukankan      html  css  js  c++  java
  • 百度、阿里、腾讯、京东等面试算法题

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


    这个问题是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自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

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

  • 相关阅读:
    onclick中的函数的参数this
    classList的使用
    设置点击鼠标时不跳转
    模块补充shutil,logging
    re模块拾遗和递归函数
    正则表达式-re模块
    软件开发规范
    自定义模块2
    常用模块
    初识自定义模块
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/14349941.html
Copyright © 2011-2022 走看看