【ARTS】打卡第二周

每周完成一个ARTS

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

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

  • 学习至少一个技术技巧

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

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

    Algorithm

    215. 数组中的第K个最大元素

    在未排序的数组中找到第 k 个最大的元素。请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。

    解法1

    时间复杂度:O(nlogn)
    思路:使用快速排序,将数组排序,然后找到第k个最大的元素。这里需要复习一下快速一下快速排序的实现方法。

    int partition(vector<int> &vec, int left, int right)
    {
        int base = vec[left];
        while(left < right)
        {
            while(vec[right] >= base && left < right)
                right --;
            swap(vec[left], vec[right]);
            while(vec[left] <= base && left < right)
                left ++;
            swap(vec[left], vec[right]);
        }
    
        return left;
    }
     int fast_sort(vector<int> &vec, int left, int right)
    {
         if (left < right)
         {
             int point = partition(vec, left, right);
             fast_sort(vec, left, point - 1);
             fast_sort(vec, point + 1, right);
         }
         return 0;
    }
    
    int findKthLargest(vector<int> &nums, int k)
    {
        if (k > nums.size())
            return 0;
        fast_sort(nums, 0, nums.size() - 1);
        return nums[nums.size() - k];
    }
    

    解法2

    时间复杂度:O(nlogn)
    思路:利用快排的思想,所获取的patiton即已经排好序的位置,将其与倒数第k的位置作比较。
    若相等,则正好是所求的第k大位置;
    若小于,则继续对[patition + 1, high]求patition;
    若大于,则继续对[low, patition - 1]求pattion。

    int partition(vector<int> &vec, int left, int right)
    {
        int base = vec[left];
        while(left < right)
        {
            while(vec[right] >= base && left < right)
                right --;
            swap(vec[left], vec[right]);
            while(vec[left] <= base && left < right)
                left ++;
            swap(vec[left], vec[right]);
        }
    
        return left;
    }
    
    int findKthLargest(vector<int> &nums, int k)
    {
        if (k > nums.size())
            return 0;
        int point = 0;
        int low = 0, high = nums.size() - 1;
        int dest = nums.size() - k;
        while(1)
        {
            point = partition(nums, low, high);
            if (point == dest)
                return nums[dest];
            else if (point > dest)
                high = point - 1;
            else
                low = point + 1;
        }
        return 0;
    }
    

    Review

    go lan Getting Started

    go语言官方文档,主要介绍了在win/mac/liunux下载、安装、测试、卸载go语言发布包的方法

    a tour of go

    the tour of go的使用方法

    • 提供交互界面来学习go的语法
    • 可以前后翻页,点击run来编译和运行交互界面上的程序,点击format可以格式化代码。
    • 可以设置本地语言,方便非英语使用者学习go
    • 指南可以下载到本地
    • 该指南是建立在运行于golang.org远程服务器的web服务,有使用的时间限制与执行时间限制

    package

    img

    • 每个go程序都是由package组成的
    • 程序以package main开始运行
    • package名与import路径名最后一个目录名相同
    • import多个package需要加上小括号,也可以写成多个import语句

    exported

    • 可被其他模块调用的函数或变量需要以大写字母开头

    functions

    • 函数可添加0个或多个参数

    • 函数参数变量名放在类型之前,返回值类型写在末尾

      img

    • 如果函数参数有同一类型变量,则可以将所有类型移除,只在最后添加一个类型

      img

    • 函数支持返回多个结果,函数调用者需要以:=来进行接收结果,对应地返回值类型需要以()写在函数名末尾

      img

    • 返回值重命名,返回值可以函数顶部作为已定义的变量,return返回没有参数,可以裸返回,这种情况应该只用于短函数中,如果用于长函数会损害可读性

      img

    变量

    • var声明变量列表,类型需要写在最后

      img

    • var后可添加变量初始化

      img

    • 在函数内部可使用:=来初始化变量,不需要写类型,可根据初始化值的类型自动判断,在函数外部不可这么使用

      img

    • 声明多种类型的变量

      img

    • 0值

      • 变量如果声明时,如果没有写明初始值,则会默认赋为0值:

        img

    • 基本类型

      img

    • 类型转换

      img

      • 使用表达式T(v)进行类型转换
      • go不支持类型的自动转换,不同类型的转换必须写出来
    • const

      • 声明变量后,变量不可被更改,即为常量
      • 不可使用:=声明变量

    Tip

    解决unzip在linux下解压中文名zip文件出现乱码的问题

    Share

    Markdown 语法说明 (简体中文版)

posted @ 2019-07-27 13:32  JESSET  阅读(203)  评论(0编辑  收藏  举报