• 【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共享内存使用常见陷阱与分析

  • 相关阅读:
    http协议
    三次握手四次挥手的原理
    mmap
    I/O多路复用之poll
    I/O多路转接之select
    自旋锁、文件锁、大内核锁
    网络基础(一)
    线程同步之(信号量)
    进程与线程的简单理解
    内存溢出——程序员必备网站
  • 原文地址:https://www.cnblogs.com/JesseTsou/p/11331530.html
Copyright © 2020-2023  润新知