- 博客(11)
- 收藏
- 关注
原创 Go切片2:Go切片实现原理
一个切片是一个数组片段的描述。它包含了指向数组的指针,片段的长度, 和容量(片段的最大长度)。 使用 make([]byte, 5) 创建的切片变量 s 的结构如下: 长度是切片引用的元素数目。容量是底层数组的元素数目(从切片指针开始)。 关于长度和容量和区域将在下一个例子说明。 进行s = s[2:4]的操作并观察切片的变化 package main import "fmt" func main() { s := make([]byte, 5) s = s[2:4] // 长度是切片引用的元
2021-05-25 17:03:58
254
原创 Go切片1:Go的切片和数组
定义一个数组 var a [4]int b := [2]string{"Penn", "Teller"} b := [...]string{"Penn", "Teller"} 定义一个切片(和数组不同的是,切片类型并没有给定固定的长度。) letters := []string{"a", "b", "c", "d"} // 函数 make 接受一个类型、一个长度和一个可选的容量参数。 s := make([]byte, 5, 5) // s == []byte{0, 0, 0, 0, 0}, 调用 mak
2021-05-25 16:16:52
225
原创 左神算法笔记: 5. 二叉树的基本算法
::二叉树不能形成环:: 先序、中序、后序遍历 先序:对任意一个子树的处理顺序,都是先头结点、再左子树、再右子树 中序:左头右 后序:左右头 [image:710374ED-4483-43C6-8740-52B0AB1597BA-22873-00006BA364335C85/iShot2020-12-18 20.40.44.png] 非递归方式实现二叉树的先序、中序、后序 任何递归函数都可以改成非递归 自己设计压栈的来实现 先序实现逻辑: 放入head 循环(如果栈不为空) 出栈为head 打印h
2020-12-19 11:01:43
293
1
原创 左神算法笔记: 4. 链表常见面试题
链表面试题常用的数据结构和技巧 使用容器(哈希表、数组等) 快慢指针 eg1. 找到一个链表的中间节点 eg2. 回文结构 笔试:全放到栈里,一个个弹出,从首节点开始比较 面试:链表的方法需要注意边界 eg3. 将单向链表按某值划分成左边小、中间相等、右边大的形式 笔试:把链表放入数组里,在数组上做partition 面试:分成大、中、小三部分,再把各个部分之间串起来 eg4. 一种特殊的单链表节点的描述如下 class Node { int value; Node
2020-12-13 17:20:27
108
原创 链表中环的问题,寻找环的起点
快慢指针从a一起出发,快指针的速度是慢指针的两倍,两指针在z点相遇: a + b = 1/2 * (a + b + n(b+c)) ==> a = (n-1)(b+c) + c , where n>=1 当n = 1,实际为快指针刚好超过慢指针1圈,也就是第一次相遇的时候:a = c 因为快指针的速度是慢指针的两倍 -> 快指针多走的距离和慢指针总共走的距离相同 -> 第一次相遇的时候快指针比慢指针刚好多走了一个环 -> 慢指针走过的距离等于一个环的长度 -> 慢指针.
2020-12-13 15:57:30
235
原创 左神算法笔记: 3. 比较器与堆
algorithem/左神算法/基础 完全二叉树 一种想象的数据结构 实际是组数: 使用0节点 左子节点:2i + 1 右子节点:2i + 2 父节点:( i - 1 ) / 2 不使用0节点 左子节点:2i 右子节点:2i + 1 父节点:i / 2 堆排序 ::堆排序的额外空间复杂度为O(1):: 先让整个数组都变成大根堆结构,建立堆的过程: 从上到下的方法(生成heap),时间复杂度为O(N*logN) 把堆的最大值(root)和堆末尾的值交换,然后减少堆的大小,做一
2020-12-11 02:16:54
305
原创 左神算法笔记: 2. 线段树(区间修改数)
algorithem/左神算法/基础 更快速的、区间的更改、查询一些东西 eg. 实现一种数据结构使得以下三种计算的时间复杂度为O(logN ) void add(arr, L, R, V); :将arr数组中的第L到R的数都增加V void update(arr, L, R, V);:将arr数组中的第L到R的数都修改V int getSum(arr, L, R);:将arr数组中的第L到R的数相加 需要多少空间: 最好情况:恰好是N = 2^n个数字,例如8,需要2N-1个空间 < 2N的空间
2020-12-11 02:13:13
392
原创 左神算法笔记: 1. 认识复杂度、对数器、二分法与异或运算
#algorithem/左神算法/基础 #sorting #XOR 评估算法优劣的核心标准 时间复杂度(流程决定) 额外空间复杂度(流程决定) 常数项时间(实现细节决定) 常数时间的操作 算数运算-加减乘除 位运算( >>[带符号右移]/ >>>[不带符号右移]/ <</ |/ &/ ^) 赋值、比较、自增、子减 数组寻址 三种排序 选择排序:遍历整个数组找最大,放在最后 冒泡排序:相邻的两个数比较谁大谁放在后面 插入排序:第k次循环的时候
2020-12-11 02:11:58
393
原创 异或运算^与算法中的应用
异或运算可以理解为是无进位相加! 异或:相同为0,不同为1 同或:相同为1,不同为0 eg1. 不用额外变量交换两个数 int a = 3; int b = 10; a = a ^ b; b = a ^ b; a = a ^ b; 注意:使用此方法必须保证要有两个空间,以下的例子为让arr[0]变为零 public static void main(String[] args) { int[] arr = {7, 20 , 33}; // swap(arr, 0, 0); // 结果为{0,
2020-12-07 21:20:09
174
原创 ^异或实现两数交换swap方法
^运算具有交换律和结合律 -> 自反:p ^ q ^ q = p 实现两数交换swap 原理: int temp = a^b; int a = temp ^ a = a ^ a ^ b = b; int b = temp ^ b = a ^b ^ b = a 代码 public static void swap(int[] arr, int i, int j) { arr[i] = arr[i] ^ arr[j]; arr[j] = arr[i] ^ arr[j]; arr[i
2020-12-07 19:28:37
368
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人