- 博客(48)
- 收藏
- 关注
原创 docker内访问https地址,提示x509: certificate signed by unknown authority
docker内访问https地址,提示x509: certificate signed by unknown authority
2022-10-14 22:45:42
4488
1
原创 求出字符串 s 与字符串 t 的第⼆⻓公共单词 js
问题描述:求出字符串 s 与字符串 t 的第⼆⻓公共单词(这⾥,假设两个字符串均由英⽂字⺟和空格字符组成);若找到这样的公共单词,函数返回该单词,否则,函数返回NULL,如果有多个满⾜要求,则返回第⼀个单词。示例:输入 s= “This is C programming text”, t=“This is a text for C programming”输出 This/** * @param {string} s * @param {string} t * @return {
2022-05-10 21:46:36
217
原创 桶排序(bucket sort) js
问题描述:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:1. 额外空间充足的情况下,尽量增大桶的数量;2. 使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中;3. 什么时候最快 当输入的数据可以均匀的分配到每一个桶中。4. 什么时候最慢 当输入的数据被分配到了同一个桶中。/** * bucket sort * @param {Array} arr * @param {Arra
2022-05-09 21:39:26
304
原创 希尔排序(shell sort) js
问题描述:希尔排序是一种递减增量的排序算法,是插入排序的一种更高效的版本。但希尔排序是非稳定排序算法。希尔排序是指先将待排序的记录序列分割为若干子序列直接进行插入排序,待整个序列记录“基本有序”时,在对全体序列进行依次插入排序步骤:1. 选择一个增量序列t1, t2, ..., tk, 其中ti>tj, tk=1;2. 按增量序列个数 k,对序列进行 k 趟排序;3. 每次排序,根据对应的增量ti,将待排序分割成若干长度为m的子序列,分别对各个字表进行直接插入排序。仅增量因子为
2022-05-07 21:48:30
209
原创 选择排序(selection sort) js
问题描述:选择排序是一种简单直观的排序算法。无论什么数据进去都是 O(n^2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。步骤:1. 首先在未排序的队列中找出最小(大)元素,存放在排序位置的启示位置。2. 再从未排序的队列中找出最小(大)元素,存放在排序队列的末尾。3. 重复步骤2,直到所有的元素排序完成。/** * selection sort * @param {Array} arr * @return {Array}
2022-05-06 22:25:37
145
原创 快速排序(quick sort) js
问题描述:快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。步骤:1. 从数列中挑出一个元素,称为 "基准"(pivot);2. 重新排序数组,所有的元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(pa
2022-05-05 21:24:43
138
原创 归并排序(merge sort) js
问题描述:归并排序是建立在归并操作系统上的一种有效排序算法,该算法采用分治法(Divide and Conquer)实现。将已有的子序列合并,得到完全有序的子序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序列表合并成一个有序表,称为二路归并。步骤:1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;4.
2022-05-02 23:15:08
78
原创 堆排序(Heapsort) js
问题描述:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序
2022-05-01 20:00:55
173
原创 计数排序(counting sort) js
问题描述:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好
2022-04-30 22:53:15
115
原创 冒泡排序(bubble sort) js
问题描述:它重复的走过要排序的元素列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访元素的工作是重复的进行知道没有可操作的元素,也就是说该列元素已经排序完成。/** * bubble sort * @param {Array} arr * @return {Array} */function bubbleSort(arr) { var len = arr.length; for (var i = 0; i < len; i++) { f
2022-04-28 21:40:58
89
原创 二叉树排序 (binary tree sort) js
描述:使用一个元素作为根结点,如果之后一个元素比第一个元素小,则放在左子树,否则放在右子树,之后按中序遍历。满足一下条件:1. 若它的左子树不为非空,则左子树上的所有节点的值均小于根结点的值。2. 若它的右子树不为非空,则右子树上的所有节点的值均大于根结点的值。3. 左右子树本身也是一个二叉排序树。/** * binary tree sort * @param {Array} arr * @return {Array} */function binaryTreeSort(
2022-04-27 22:09:48
132
原创 基数排序(radix sort)
问题描述:基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。步骤:以整数为例,将整数按十进制位划分,从低位到高位执行以下过程。1. 从个位开始,根据0~9的值将数据分到10个桶桶,例如12会划分到2号桶中。2. 将0~9的10个桶中的数据顺序放回到数组中。3. 重复上述过程,一直到最高位。上述方法称为LSD(Least significant
2022-04-26 22:02:25
83
原创 计数排序(counting sort)
问题描述:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好
2022-04-25 21:26:22
118
原创 快速排序(quick sort)
问题描述:快速排序使用分治法(Divide and conquer)策略来把一个串行(list)分为两个子串行(sub-lists)。快速排序又是一种分而治之思想在排序算法上的典型应用。本质上来看,快速排序应该算是在冒泡排序基础上的递归分治法。注意:快速排序的最坏运行情况是 O(n²),比如说顺序数列的快排。但它的平摊期望时间是 O(nlogn),且 O(nlogn) 记号中隐含的常数因子很小,比复杂度稳定等于 O(nlogn) 的归并排序要小很多。所以,对绝大多数顺序性较弱的随机数列而言,
2022-04-24 20:33:38
144
原创 插入排序(insertion sort)
问题描述:插入排序的基本操作就是将一个数据插入到已经排序好的有序数列中,从而得到一个新的,个数加一的有序数列,算法适用于少量数据的排序,时间复杂度为O(n^2)。是稳定排序算法。package mainimport "fmt"func main() { arr := insertionSort([]int{1, 4, 5, 6, 3}) fmt.Printf("result %v", arr)}func insertionSort(arr []int) []int { for
2022-04-22 21:40:06
58
原创 冒泡排序(bubble sort)
问题描述:它重复的走过要排序的元素列,依次比较两个元素,如果他们的顺序错误就把他们交换过来。走访元素的工作是重复的进行知道没有可操作的元素,也就是说该列元素已经排序完成package mainimport "fmt"func main() { arr := bubbleSort([]int{1, 3, 4, 2, 6}) fmt.Printf("result %v", arr)}func bubbleSort(arr []int) []int { length := len(
2022-04-21 22:04:08
53
原创 归并排序(merge sort)
问题描述:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数。当输入的元素是 n 个 0 到 k 之间的整数时,它的运行时间是 Θ(n + k)。计数排序不是比较排序,排序的速度快于任何比较排序算法。由于用来计数的数组C的长度取决于待排序数组中数据的范围(等于待排序数组的最大值与最小值的差加上1),这使得计数排序对于数据范围很大的数组,需要大量时间和内存。例如:计数排序是用来排序0到100之间的数字的最好
2022-04-20 22:46:28
150
原创 选择排序(selection sort)
问题描述:选择排序是一种简单直观的排序算法。无论什么数据进去都是 O(n^2) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。步骤:1. 首先在未排序的队列中找出最小(大)元素,存放在排序位置的启示位置。2. 再从未排序的队列中找出最小(大)元素,存放在排序队列的末尾。3. 重复步骤2,直到所有的元素排序完成。package mainimport "fmt"func main() { arr := selectionSor
2022-04-19 22:12:38
83
原创 希尔排序(shell sort)
问题描述:希尔排序是一种递减增量的排序算法,是插入排序的一种更高效的版本。但希尔排序是非稳定排序算法。希尔排序是指先将待排序的记录序列分割为若干子序列直接进行插入排序,待整个序列记录“基本有序”时,在对全体序列进行依次插入排序步骤:1. 选择一个增量序列t1, t2, ..., tk, 其中ti>tj, tk=1;2. 按增量序列个数 k,对序列进行 k 趟排序;3. 每次排序,根据对应的增量ti,将待排序分割成若干长度为m的子序列,分别对各个字表进行直接插入排序。仅增量因子为1时
2022-04-18 21:58:54
83
原创 归并排序(merge sort)
问题描述:归并排序是建立在归并操作系统上的一种有效排序算法,该算法采用分治法(Divide and Conquer)实现。将已有的子序列合并,得到完全有序的子序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序列表合并成一个有序表,称为二路归并。步骤:1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置;3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;4.
2022-04-17 19:34:08
66
原创 堆排序(Heapsort)
问题描述:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:1. 大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;arr[i] >= arr[2i+1] && arr[i] >= arr[2i+2]2. 小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序
2022-04-16 21:11:15
110
原创 二叉树排序
问题描述:使用一个元素作为根结点,如果之后一个元素比第一个元素小,则放在左子树,否则放在右子树,之后按中序遍历。满足以下条件:1. 若它的左子树不为非空,则左子树上的所有节点的值均小于根结点的值。2. 若它的右子树不为非空,则右子树上的所有节点的值均大于根结点的值。3. 左右子树本身也是一个二叉排序树。package main import "fmt" // BST ...type BST struct { left *BST value int right *BS
2022-04-15 21:43:13
314
原创 记一次python请求oss链接下载文件失败
问题描述:某次使用python去请求oss的链接下载文件,使用默认的链接可以直接导出成功,但当访问一个链接文件循环下载时,使用request.get获取文件返回403, 代码如下# -*- coding: utf-8 -*-from urllib.parse import urlparse, unquoteimport ntpathimport requestsdef get_filename(url_str): url = urlparse(unquote(url_str)) re
2022-04-13 22:04:54
1556
原创 golang处理execl文件
1. 引入execl依赖包go get github.com/xuri/excelize/v22. 打开execl文件,并获取句柄// 打开文件,获取句柄f, err := excelize.OpenFile(path)if err != nil { fmt.Println("OpenFile failed: ", err) return}3. 获取execl的Sheet列表// 获取execl的Sheet列表sheets := f.GetSheetLi
2022-04-12 22:08:21
514
原创 括号生成字符串列表
问题描述:数字n代表生成括号的对数,请设计一个函数,用于能够生成所有可能的并且有效的括号组合示例:输入: n = 3输出:["((()))", "(()())","(())()", "()(())", "()()()"]输入: n = 1输出: ["()"]package mainimport ( "fmt")var ( arr []string)func printBracket(str string, left, right int) { if..
2022-04-11 22:42:22
47
原创 验证二叉搜索树
问题描述:给你一个二叉树的根节点root,判断其是否是一个有效的二叉搜索树。有效二叉树定义如下:1. 节点的左子树只包含小于当前节点的数;2. 节点的右子树只包含大于当前节点的数;3. 所有左子树和右子树自身也必须是二叉搜素树示例1:输入: root = [2, 1, 3]输出: true示例2:输入:root = [5, 1, 4, null, null, 3, 6]输出: falsepackage mainimport ( "fmt")t
2022-04-09 23:06:10
254
原创 二叉树层序遍历
问题描述:给你二叉树的根节点root,返回其节点值的层序遍历,即逐层地,从左到右访问所有节点示例:输入: root = [3, 9, 20, null, null, 15, 7]输出:[[3], [9, 20], [15, 7]]package mainimport ( "fmt")type queue []*treeNodefunc(q *queue) push(v *treeNode) { *q = append(*q, v)}func(q *queue)
2022-04-08 22:23:28
332
原创 二叉树的最大深度
问题描述:给定一个二叉树,找出其最大深度,其中二叉树的深度为根结点到最远子节点的最长路径上的节点数说明:叶子结点是指没有叶子结点的节点示例:给定二叉树 [3, 9, 20, null, null, 15, 7],返回最大深度3package mainimport ( "fmt")type queue []*treeNodefunc(q *queue) push(v *treeNode) { *q = append(*q, v)}func(q *queue)
2022-04-07 22:57:24
524
原创 浏览器如何处理大数据量的文件?
问题描述:最近有个需求需要对超过1G的文件进行处理,例如生成布隆过滤器文件等,由于文件是在本地,需要本地上传到服务端去处理,由于数据量比较大,对网络的压力比较大,所以考虑是否可以在本地进行处理完然后再上传。注: 处理完的数据比较小,约几十M解题方法:本地处理的方法如下:1. 提供一个本地的数据处理小工具(与语言无关),然后处理完成的数据进行上传;2. 通过浏览期进行处理,处理完然后上传;对比1和2, 其中1实现比较简单,但是需要兼容多种系统,同时用户使用有成本,所以选用2方式实现,2只需要
2022-04-06 21:33:38
2628
原创 二叉树的前序遍历
问题描述:给你二叉树的根节点root,返回它节点值的前序遍历。示例:输入:head = [1, null, 2, 3]输出:[1, 2, 3]解题思路:递归二叉树package mainimport ( "fmt")type treeNode struct { value int left *treeNode right *treeNode}func (t *treeNode) insert(v *treeNode) { if t.value .
2022-04-05 20:54:38
379
原创 反转单链表
问题描述:给你单链表的头节点head,请你反转链表,并返回反转后的链表。示例:输入:head = [1, 2, 3, 4, 5]输出:[5, 4, 3, 2, 1]解题思路:遍历链表,创建新的节点指向新链表的head,同时修改新链表的head指向新的地址package mainimport ( "fmt")type Node struct { Value int Next *Node}type List struct { head *Node si
2022-04-05 17:32:24
521
原创 布隆过滤器-go demo
描述:布隆过滤器(Bloom Filter)是一个基于hash的概率性的数据结构,它实际上是一个很长的二进制向量,可以检查一个元素可能存在集合中,和一定不存在集合中。它的优点是空间效率高,但是有一定false positive(元素不在集合中,但是布隆过滤器显示在集合中)。主题:多个hash,增大随机性,减少hash碰撞的概率。扩大数组范围,使hash值均匀分布,进一步减少hash碰撞的概率。场景:海量数据查找某条记录是否存在缓存穿透等package mainimport (.
2022-04-03 22:09:51
520
原创 复杂链表复制
问题描述:请实现函数ComplexListNode Clone(ComplexListNode head),复制一个复杂链表。在复杂链表中,每个结点除了有一个Next指针指向下一个结点外,还有一个Sibling指向链表中的任意结点或者NULL。解题思路:1.根据原始链表的每个结点N创建对应的复制节点,并添加到每个节点之后,行成一个新的链表2. 遍历新的链表,重置复制的节点的random指针为原指针的后一个地址3. 拆分出两个链表package mainimport ( "f.
2022-04-02 20:43:35
608
原创 golang实现单链表
单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素。链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) +指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。package mainimport ( "fmt")type node struct { value int next *node}type List struct { head *node tail *node size int.
2022-04-01 22:14:28
921
原创 could not read Username ... terminal prompts disabled
问题描述:使用goland初始化go 项目加载go.mod时,报错误提示:fatal: could not read Username ... terminal prompts disabled问题定位:由于加载go.mod使用的是go get命令,其中go get 命令用于从远程代码仓库(比如 Github )上下载并安装代码包,由于使用的是内网的仓库的依赖包,所以猜测可能是没有配置git config相关的配置通过命令git config --list或vi ~/.gitconf
2022-03-31 22:41:32
6577
原创 滑动窗口最大值
问题描述:给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。返回 滑动窗口的最大值示例:输入: nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3输出:[3 3 5 5 6 7]解题思路:考虑多种情况,1. 当nums的长度小于等于k或者为0时,直接计算当前数据的最大值进行返回;2. 当nums的长度大于k时,需要计算每个窗口出现数的最大值..
2022-03-31 22:07:47
259
原创 请定义一个队列并实现函数 max_value得到队列里面的最大值
问题描述:请定义一个队列并实现函数 max_value得到队列里面的最大值,要求函数max_value、push_back和pop_front的均摊时间复杂度都是O(1),若队列为空,push和pop需要返回-1。示例:输入:push(1) , push(2), push(1), max_value(), pop(), pop(), max_value(), pop(),max_value()输出:null, null,null, 2, -1, -1, 1, -1, -1...
2022-03-30 23:04:12
976
原创 请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数
问题描述:请根据每日气温列表,重新生成一个列表。对应位置的输出为:要想观测到更高的气温,至少需要等待的天数。如果气温在这之后都不会升高,请在该位置用0来代替。例如,给定一个列表tenperatures【73,74,75,71,69,72,76,73】,你的输出应该是[1,1,4,2,1,1,0,0].解题思路:首先考虑要计算高于当前数值出现的位置,需要借助一个数据结构存储历史计算的结果,考虑数据特性,可以借助栈来存储,使用栈后入先出的特性,倒序存储数据的值。根据气温列表arr的长度,初始
2022-03-29 22:33:59
720
原创 定义栈的数据结构,请在该类型中实现一个能够得到该栈最小元素的min函数,在该栈中调用min、push及pop的时间复杂度都是O(1)
问题描述:定义栈的数据结构,请在该类型中实现一个能够得到该栈最小元素的min函数,在该栈中调用min、push及pop的时间复杂度都是O(1)示例:入栈 5 3 4 1 10 最小值 10出栈 10 1 最小值 3解题思路:为了保证min的时间复杂度为O(1),所以需要借助一个新的空间存储栈的最小值,由于数据是无序的,而且时间复杂度为O(1),所以需要单独开辟一个栈,每次插入新值以后,获取当前位置的最小值,存入到备份栈中,结构如下:入栈:5 -> 3 -> 4
2022-03-28 22:56:47
204
原创 斐波那契数列
问题描述斐波那契数列是一个序列为:1,1,2,3,5,8,13,21… 也就是每个数等于它前两个数之和。那么给你第 n 个数,问 F(n) 是多少。斐波那契数列公式:f(n) = f(n-1)+f(n-2)示例:输入: n = 3输出: 3package mainimport ( "fmt")func fibonacci(n int) int { if (n == 0 || n == 1) { return 1 } a, b := 1, 1 for n
2022-03-28 21:36:29
253
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人