zoukankan      html  css  js  c++  java
  • LeetCode只出现一次的数字Swift

    给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    说明:

    你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

    示例 1:

    输入: [2,2,1]
    输出: 1


    示例 2:

    输入: [4,1,2,1,2]
    输出: 4

    思路:

    异或运算
    a^0 = a、a^a = 0、a^b^a = b。
    这个公示满足交换律 ==> a^b^a = a^a^b = 0^b = b
    由于重复出现的次数均为2次。给所有的元素做异或运算,在通过交换率的可以得出 ==> 0^0^0...^a(i), a(i)就是那个只出现一次的数

    class Solution {
        func singleNumber(_ nums: [Int]) -> Int {
            var res = 0
            for value in nums {
                res = res ^ value
            }
            return res
        }
    }

    高阶解法

    class Solution {
        func singleNumber(_ nums: [Int]) -> Int {
            return nums.reduce(0, ^)
        }
    }

    扩展:

    map 映射,返回了一个结果集,该集合中包含的所有元素是来于对源数组中每一个元素进行相同的转换之后形成的新元素。

    filter 过滤,返回一个结果集,该集合包含的元素是源数组中的每一个符合筛选条件的元素。

    reduce 组合,返回一个值,该值是对初始值和集合中的每个元素调用闭包中相同的操作生成的

    flatMap 连接,返回了一个结果集,将所有元素糅合到第一个元素类型中,过滤掉nil的

            let digits = [1, 4, 10, 15]
            //映射(对每个元素单独执行映射)
            let a = digits.map { $0 + 2 }
            print(a)
            //过滤(保留满足条件的偶数)
            let b = digits.filter { $0 % 2 == 0 }
            print(b)
            //组合(对所有元素执行归并操作)
            let c = digits.reduce(0, +)
            print(c)
            //连接(糅合到第一个元素类型中)
            let collections = [[5, 2, 7], [4, 8], [9, 1, 3]]
            let d = collections.flatMap { $0 }
            print(d)
            //链式语法
            let e = collections.flatMap { $0 }.filter { $0 % 2 == 0 }.reduce(0, ^)
            print(e)

    打印结果

    [3, 6, 12, 17]
    [4, 10]
    30
    [5, 2, 7, 4, 8, 9, 1, 3]
    14
  • 相关阅读:
    关于Flutter引用image_picker插件报错
    关于Flutter页面布局
    关于Flutter和Android混合开发引入flutter_boost插件-有更新,见底部
    关于uni-app的scroll-into-view
    关于全站http切换到https
    关于canvas画原子运动模型
    [BS-00] const限定常量或者变量(初次赋值后),其值不允许被改变
    认识C和内存管理
    C语言的内存管理
    堆heap和栈Stack(百科)
  • 原文地址:https://www.cnblogs.com/huangzs/p/14143118.html
Copyright © 2011-2022 走看看