【ARTS】打卡第四周

每周完成一个ARTS

  • 每周至少做一个 leetcode 的算法题

  • 阅读并点评至少一篇英文技术文章

  • 学习至少一个技术技巧

  • 分享一篇有观点和思考的技术文章。

  • (也就是 Algorithm、Review、Tip、Share 简称ARTS)

    Algorithm

    3.无重复字符的最长子串

    给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

    解法

    思路:滑动窗口,两个指针分别表示子串的两个边界,用数组来保存字符的状态,0表示不存在,1表示已存在,当右边界向右滑动时,若新的元素不存在时,则继续向右滑动;若新元素已经存在时,则左边界向右滑动,直到新元素不再重复为止。

    时间复杂度:O(n)

    int lengthOfLongestSubstring(string s) {
        if (s.size() <= 1)
        {
            return s.size();
        }
        int i = 0, j = 1;
        int str[128] = {0};
        str[s[i]] = 1;
        int maxlen = 0;
        int len = 0;
        while(j < s.size())
        {
            if (str[s[j]] == 0)
            {
                str[s[j++]] = 1;
                len = j - i;
                if (len > maxlen)
                {
                    maxlen = len;
                }
            }
            else
            {
                str[s[i++]] = 0;
            }
        }
      return maxlen;
    }
    
       
    

    Review

    https://tour.golang.org/moretypes/1

    • 指针

      • go语言包含指针,指向一个值的内存地址
      • T表示指向值T的地址,T的0值是nil
      • &操作符生成操作数的指针
      • *操作符表示指针所指向的值
      • go语言没有指针运算
    • 结构体

      • 使用圆点.来访问结构体成员
    • 结构体指针

      • 结构体成员能够通过结构体指针进行访问
      • 通过指针访问时,(*p).X访问成员X,但go语言允许以p.X的方式访问成员X
    • 结构体常量

      • 通过列出结构体成员的值,申请相应内存空间
      • 可以只列出一部分成员的值,以Name:value的语法来指定位对应成员的值
      • &可以返回对应结构体常量的指针
    • 数组

      • 声明形式:var a [num]T
      • 数组的长度是类型的一部分,所以数组不能改变大小
    • 切片

      • 声明形式:a []T

      • 数组赋值给切片,需要两个索引,高低边界,以:分隔

      • 对应数组边界以[)半开取值,即包含第一个索引的值,但不饮食最后一个索引的值

        • s包含primes的第一个值,但不包含其第四个值,即s为[2,3,5]
      • 切片类似数组的引用

        • 切片本身不存储任何数据,只是描述数组的一部分
        • 改变切片的元素,即对应改变数组相应的元素,该数组的其他的切片共享该变化
      • 切片常量

      • 像没有长度的数组

      • 默认切片

        • [low:high]中的low与high均可省略
        • [low:high]表示数组的low:high
        • [low:]表示数组的low到最后
        • [:high]表示数组0到high
        • [:]表示数组全部
      • 切片长度与最大长度

        • 切片长度是指切片当前包含的元素个数
        • 切片最大长度是指其对应上层数组元素的个数
        • len(s)可得切片长度
        • cap(s)可得切片最大长度
      • 空切片

        • 空切片为nil
        • 长度与最大长度均为0
        • 没有上层数组
      • 通过make内存函数来创建切片

      • make([]T, len)创建长度、最大长度为len的切片,元素值为0

      • make([]T, len, cap)创建长度为len、最大长度为cap的切片,元素值为0

      • 切片的切片

      • 切片能包含任务类型,当然也可以包含其他切片

      • 切片添加元素

      • append(s[]T, var...)

        • 第一个参数为类型为[]T的切片
        • 后面的参数为类型为T的变量
        • 可将变量添加到切片中
      • 如果切片的上层数组空间不足以添加被给的元素,则重新申请新的数组,返回值指向新申请的数组

      • range

      • for循环遍历一个切片slice或map时,range迭代遍历器
      • 遍历一个切片时,返回两个值,第一个是索引位置,第二个是该索引的元素值
    • map

      • map映射key value键值对

      • map的的空值是nil,nil没有key,key值也不能被添加

      • make函数返回一个给定类型的map

      • map变量

      • 已赋值的map变量

      • 若顶级的类型只是类型名,则可忽略类型名

      • map操作

      • 插入或更新
        • m[key] = elem
      • 取得对应值
        • elem = m[key]
      • 删除
        • delete(m,key)
      • 测试键值
        • elem, ok = m[key]
        • 如果key是m中,则ok为true,elem为对应的值
        • 如果key不在m中,则ok为false,elem为0值
    • 函数值

      • 函数值能够像其他值一样传递
    • 闭包

      • 闭包是一个可以引用函数体外部的变量的函数

    Tip

    Redis实现分布式锁

    利用的redis的单线程的特性,使用setnx命令来实现分布式锁

    Share

    LINUX共享内存使用常见陷阱与分析

posted @ 2019-08-10 14:54  JESSET  阅读(164)  评论(0编辑  收藏  举报