zoukankan      html  css  js  c++  java
  • 基础算法:求目标值 &字符串反转

    第1题
    给出一个整型数组和一个目标值,判断数组中是否有2个数之和等于目标值,若有就返回true,否则返回false。

    解法:
    方案一:如果2层for循环暴力解题,O(n*n)不是我们想要的解法

    方案二:采用集合可以优化时间复杂度,即在遍历数组的过程中,用集合每次保存当前的值。假如集合中已经有了一个数等于目标值减去当前值,则证明在之前的遍历中一定有一个数与当前值之和等于目标值。这种方法的时间复杂度是O(n).

      func twosums(target: Int, nums: [Int]) -> Bool {
            var set = Set<Int>()
            for num in nums {
                if set.contains(target - num) {
                    return true
                }
                set.insert(num)// 如果没找到,遍历数组的过程中,用集合每次保存当前的值
            }
            return false
        }

    第2题:【稍微变型下】

    给定一个整型数组中有且仅有俩个数之和等于目标值,求这两个数在数组中的序号。

    解法:

    解题思路与上道题类似,但是为了得到序号,这里就使用字典。并且key是num,value是下标

      func twosumsForIndex(target: Int, nums: [Int]) -> [Int] {
            var dict = [Int:Int]()
            for ( i, num ) in nums.enumerated() {
                if let lastIndex = dict[target - num] {
                    return [ i, lastIndex ]
                }else {
                    dict[num] = i //key是num,value是下标
                }
            }
            return []
        }

    第3题:
    给出一个字符串,要求按照单词顺序进行反转

    解法:
    eg: 字符串"the sky is blue",反转后的结果是"blue is sky the"

    这个题想想就能感受到,不好动手呀。但是有一个很巧妙的办法:

    先反转整个字符串,"the sky is blue"变成 "eulb si yks eht"

    每个单词在独立反转,"eulb si yks eht"变成 "blue is sky the"

    代码如下:
    2个辅助函数:

    // 辅助函数:作用是反转
    func reverse<T>( chars: inout [T], start: Int, end: Int) {
        var start = start, end = end
        while start < end {
            swap(chars: &chars, p: start, q: end)
            start += 1
            end -= 1
        }
    }
    func swap<T>(chars: inout [T], p: Int, q: Int) {
        (chars[p], chars[q]) = (chars[q], chars[p])
    }

    下面是主要的算法:

    func reverseWords(s: String?) -> String? {
        guard let s = s else { return nil }
        var chars = Array(s)
        var start = 0 , end = s.count - 1
        reverse(chars: &chars, start: start, end: end)
        /**
         * 如果  chars[i+1] == " " ,说明是一个单词到了可以进行反转了 ,这里的 i+1很巧妙,后续的 i+2 也是因此而来
         */
        for i in 0..<chars.count {
            if i == chars.count - 1 || chars[i+1] == " " {
                reverse(chars: &chars, start: start, end: i)
                start = i + 2 //很巧妙
            }
        }
        return String(chars)
    }

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

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

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

     

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

  • 相关阅读:
    LightOJ 1132 Summing up Powers(矩阵快速幂)
    hdu 3804 Query on a tree (树链剖分+线段树)
    LightOJ 1052 String Growth && uva 12045 Fun with Strings (矩阵快速幂)
    uva 12304 2D Geometry 110 in 1! (Geometry)
    LA 3263 That Nice Euler Circuit (2D Geometry)
    2013 SCAUCPC Summary
    poj 3321 Apple Tree (Binary Index Tree)
    uva 11796 Dog Distance (几何+模拟)
    uva 11178 Morley's Theorem (2D Geometry)
    动手动脑
  • 原文地址:https://www.cnblogs.com/Wu13241454771/p/14793653.html
Copyright © 2011-2022 走看看