算法
1. 算法
排序算法
平均时间复杂度
最坏时间复杂度
最好时间复杂度
空间复杂度
稳定性
冒泡排序
O(n^2)
O(n^2)
O(n)
O(1)
稳定
选择排序
O(n^2)
O(n^2)
O(n^2)
O(1)
不稳定
插入排序
O(n^2)
O(n^2)
O(n)
O(1)
稳定
希尔排序
O(n log n)
O(n^2)
O(n log^2 n)
O(1)
不稳定
归并排序
O(n log n)
O(n log n)
O(n log n)
O(n)
稳定
快速排序
O(n log n)
O(n^2)
O(n log n)
O(log n)
不稳定
堆排序
O(n log n)
O(n log n)
O(n log n)
O(1)
不稳定
计数排序
O(n + k)
O(n + k)
O(n + k)
O(k)
稳定
桶排序
O(n + k)
O(n^2)
O(n)
O(n + k)
稳定
基数排序
O(n * k)
O(n * k)
O(n * k)
O(n + k)
稳定
鼠标右键执行程序
前言最近在研究如何右键使用Typora打开当前文件夹,于是到网上查找注册表相关的知识,学到了一下有趣的东西
设置注册表设置注册表右键使用Typora打开当前文件夹
方法一使用cmd打开注册表(regedit)
找到计算机\HKEY_CLASSES_ROOT\Directory\Background\shell
在这个目录下文件夹都是右键打开的项目,比如:
配置的步骤如下:
在shell目录下,右键新建项,名字可以随便起,但是可以清楚知道这个项主要配置的右键打开的哪个项目;
将名称为默认的数据改为Open With Typora,这个即为右键显示的项目名;
添加一个字符串值,名称为icon,数据为Typora的图标地址,直接复制图标地址,不需要使用双引号括起来,标签图片必须为ico类型的图标文件;
再回到Typora右键新建项,名字为command;
将名称为默认的数据改为"Typora地址" "%V"(双引号加上Typora的地址,加上空格,再加上双引号,里面是%和V)
注:%V表示站位符,表示当前文件夹的路径
方法二使用注册表方式直接将数据注册到注册表
Windows R ...
前端回顾
隐藏页面中某个元素的方法1.opacity:0,该元素隐藏起来了,但不会改变页面布局,并且,如果该元素已经绑定 一些事件,如 click 事件,那么点击该区域,也能触发点击事件的
2.visibility:hidden,该元素隐藏起来了,但不会改变页面布局,但是不会触发该元素已 经绑定的事件 ,隐藏对应元素,在文档布局中仍保留原来的空间(重绘)
3.display:none,把元素隐藏起来,并且会改变页面布局,可以理解成在页面中把该元素。 不显示对应的元素,在文档布局中不再分配空间(回流+重绘)
CSS 选择器及优先级选择器
id 选择器(#myid)
类选择器(.myclass)
属性选择器(a[rel=”external”])
伪类选择器(a:hover, li:nth-child)
标签选择器(div, h1,p)
相邻选择器(h1 + p)
子选择器(ul > li)
后代选择器(li a)
通配符选择器(*)
优先级:
!important
内联样式(1000)
ID 选择器(0100)
类选择器/属性选择器/伪类选择器(0010)
元素选择器/伪元素选择器(00 ...
Python
Python导入包顺序
标准库导入
相关第三方库导入
本地应用/库的导入,按照字母顺序
配置pip源
在C:\Users\Administrator下新建pip文件夹
在文件夹里新建pip.ini文件,并写入如下内容
[global]index-url = https://pypi.tuna.tsinghua.edu.cn/simple/[install]trusted-host = pypi.tuna.tsinghua.edu.cn
*args与*kwargs 的区别*args 用于传递可变数量的非关键字参数,以元组的形式传递。
*kwargs 用于传递可变数量的关键字参数,以字典的形式传递。
def example_function(*args, **kwargs): print("Non-keyword arguments:") for arg in args: print(arg) print("\nKeyword arguments:") for key, value in kwargs.items(): pr ...
JVM
JVM 的组成
常用的是 Hotspot,Hotspot8 以上收费
JDK、JRE、JVM 之间的关系
前端面试速记
1. this
箭头函数没有作用域,this 指向上一级
2. 闭包为什么使用闭包?
避免变量被污染
私有化
保存变量,常驻内存
;(function fn () { let a = 10 let b = 30 function a () {} return {}})()// 当前的a与闭包里的a不冲突let a = 15
使用场景
防抖和节流中也会用到闭包
库的封装(保证数据私有性)
例子
// 计数器// 闭包应用 => 处理私有数据let makeCounter = function () { let privateCounter = 0 function changeBy (val) { privateCounter += val } return { increment: function () { changeBy(1) }, decrement: function () { changeBy(-1) }, value: function () { return privat ...
计算机网络
1. TCP 的三次握手和四次挥手三次握手和四次挥手是 TCP 协议中的概念,用于建立和断开 TCP 连接。
三次握手的过程如下第一次握手:客户端向服务器发送 SYN 包,并进入 SYN_SENT 状态。第二次握手:服务器收到 SYN 包后,向客户端发送 SYN+ACK 包,并进入 SYN_RCVD 状态。第三次握手:客户端收到 SYN+ACK 包后,向服务器发送 ACK 包,并进入 ESTABLISHED 状态。
四次挥手的过程如下第一次挥手:客户端向服务器发送 FIN 包,并进入 FIN_WAIT_1 状态。第二次挥手:服务器收到 FIN 包后,向客户端发送 ACK 包,并进入 CLOSE_WAIT 状态。第三次挥手:服务器向客户端发送 FIN 包,并进入 LAST_ACK 状态。第四次挥手:客户端收到 FIN 包后,向服务器发送 ACK 包,并进入 TIME_WAIT 状态,等待 2MSL 后进入 CLOSED 状态。
作用三次握手是为了确保客户端和服务器之间的通信是可靠的,防止因为网络延迟等原因导致的数据传输错误。四次挥手是为了确保客户端和服务器之间的连接能够正常断开,防止因为 ...
JavaScript
进制转换可以使用toString(a),进行进制转换,a填需要转换的进制
let a = 10a.toString(2) // '1010'a.toString(16) // 'a'
字符串新增方法
includes():是否找到了参数字符串。
startsWith():参数字符串是否在原字符串的头部。
endsWith():参数字符串是否在原字符串的尾部。
repeat(n):将原字符串重复n次。会先将n取整,若仍为负数,则报错Infinity;若n为字符串,则转换成数字。
padStart():用于头部补全。
padEnd():用于尾部补全。
trimStart()、trimLeft():消除字符串头部的空格。
trimEnd()、trimRight():消除尾部的空格。
matchAll():返回一个正则表达式在当前字符串的所有匹配,返回的是一个遍历器(Iterator),需要使用for…of取出,也可以使用结解构将其转成数组[...string.matchAll(regex)]。
replaceAll():可以一次性替换所有匹配,searchValue必须是全局的正则 ...
Java
ThreadLocalThreadLocal直译为线程局部变量
特点
只能在自己的线程内访问自己的数据,另外的线程是访问不到其他ThreadLocal的
ThreadLocal<Person> tl = new ThreadLocal<>();new Thread(() -> { SleeperHelper.sleepSecond(1); tl.set(new Person("zhangsan")); System.out.println(tl.get());}).start();new Thread(() -> { SleeperHelper.sleepSecond(2); System.out.println(tl.get());}).start();// 输出对象地址// null
应用场景
Spring事务处理方案(@Transaction)
存储全局用户登录信息
存储数据库连接,以及Session等信息
内存内存溢出内存空间装满了,这时再进入对象,没法分配空间,就会报内存溢出错误(out of mem ...











