前言

本专栏转载于Githublabuladong/fucking-algorithm. 用于个人学习算法所需.

本仓库总共 60 多篇原创文章,基本上都是基于 LeetCode 的题目,涵盖了所有题型和技巧,而且一定要做到举一反三,通俗易懂,绝不是简单的代码堆砌,后面有目录。
我先吐槽几句。刷题刷题,刷的是题,培养的是思维,本仓库的目的就是传递这种算法思维。我要是只写一个包含 LeetCode 题目代码的仓库,有个锤子用?没有思路解释,没有思维框架,顶多写个时间复杂度,那玩意一眼就能看出来。
只想要答案的话很容易,题目评论区五花八门的答案,动不动就秀 python 一行代码解决,有那么多人点赞。问题是,你去做算法题,是去学习编程语言的奇技淫巧的,还是学习算法思维的呢?你的快乐,到底源自复制别人的一行代码通过测试,已完成题目 +1,还是源自自己通过逻辑推理和算法框架不看答案写出解法?
网上总有大佬喷我,说我写这玩意太基础了,根本没必要啰嗦。我只能说大家刷算法就是找工作吃饭的,不是打竞赛的,我也是一路摸爬滚打过来的,我们要的是清楚明白有所得,不是故弄玄虚无所指。不想办法做到通俗易懂,难道要上来先把《算法导论》吹上天,然后把人家都心怀敬仰地劝退?别的不说,公众号几万读者,PDF 版本上万次下载,联系我的出版社都好几家,说明质量还过得去吧?
做啥事情做多了,都能发现套路的,我把各种算法套路框架总结出来,相信可以帮助其他人少走弯路。我这个纯靠自学的小童鞋,花了一年时间刷题和总结,自己写了一份算法小抄,后面有目录,这里就不废话了。

PS:如果想下载此仓库到本地学习,不要用 git 命令下载,点击 GitHub 网页上的下载按钮直接下载 zip 文件,这样就不会下载 git 历史,大大加快下载速度

目录

mac安装jupyterlab,使用pip3 install jupyterlab实际上安装的还是jupyter,并不起作用,仍然需要一系列操作来完成。可以使用brew install jupyterlab的方式完成安装。

但此时jupyterlabpython3是什么关系呢?

实际上,jupyterlab依旧是引用的python3,而非独立安装了一份python,且两者的pip库通用。jupyterlab的库的位置在/usr/local/Cellar/jupyterlab/3.0.9/libexec/lib/python3.9/site-packages,而python3的库位置在/usr/local/lib/python3.9/site-packages。对于在jupyterlab网页界面安装的插件,会同步安装,但是通过系统pip3安装的,则只会安装到python3所在的库位置,并不会同步,且不会作用于jupyterlab

比如这里我们所需要的汉化插件,jupyterlab-language-pack-zh-CN,若只采用默认安装的方式,并不能汉化成功,而同步安装在jupyterlab库的位置之后,汉化正常。

使用pip(3) uninstall jupyter的方式无法卸载完全,使用pip-autoremove包也如此,因而只能采用以下方式:

1
2
3
4
5
6
7
8
pip3 uninstall -y jupyter
pip3 uninstall -y jupyter_core
pip3 uninstall -y jupyter-client
pip3 uninstall -y jupyter-console
pip3 uninstall -y notebook
pip3 uninstall -y qtconsole
pip3 uninstall -y nbconvert
pip3 uninstall -y nbformat

软件工具

Sakura Frp(Frp二次开发,可视化)

流程

  1. 注册账号并登陆
  2. 每日领取流量

upload successful

  1. 软件下载

upload successful

推荐使用自动安装脚本,按照提示填入id和秘钥

upload successful

  1. 添加和管理隧道

upload successful

隧道协议分为tcp,udp,http,https,xtcp等,不同协议的区别参见网页右下方。
   
upload successful
 对于我们常用的远程桌面(rdp),ssh,均可用这种方式。  

服务器选择

       
upload successful
可建站表示支持http隧道服务映射。?M表示带宽,优先使用国内的服务器,速度较快。        

TCP隧道设置

upload successful

隧道名称和备注随意设置,本机地址留空即可,本地端口即为内网服务器的端口,比如ssh默认22,rdp默认3389,远程端口可以自己设置,符合规则即可,默认留空也可以。

下方的加密传输和压缩数据可打开。        

HTTP隧道设置

       
upload successful
       和TCP协议对比,域名替代了远程端口。需要自己注册域名。绑定自己域名后,可以直接不带端口地访问自己域名。
       
upload successful

  • 备注:选择服务器时需选择 可建站的类型!

  • 备注:建站也未必需要http隧道,使用tcp隧道也可以,但需要带端口访问。 参考链接.          

    配置文件:

    使用脚本安装软件后,会提示创建系统服务,按照提示输入token和隧道之后,会自动创建systemd服务。根据自身需要,可以对配置文件进行修改。
         
    服务脚本类似如下:

upload successful

其中被遮挡的部分为个人秘钥,数字部分为隧道列表
   
upload successful
   
可以看出,355729隧道正常启动,通过yfsonline.top即可访问.

对于同一个服务器的不同隧道端口,可以修改配置文件
   
upload successful

对于不同的服务器,比如上面所列,则对于每一个服务器需要额外配置。目前所采用的方式为新建systemd服务(很蠢但有效),如下:
   
upload successful

随后通过systemctl enable/restart *.service的方式即可配置好服务。

可能遇到的部分很蠢的问题

  1. 服务无法正常启动
    检查服务配置文件的隧道ID,里面的id为初次配置时生成的,在反复测试的过程中可能这个隧道已经被你删除了。

  2. 按教程配置好之后,依旧无法远程访问ssh服务
    sshd端口是否输入正确? sshd服务有没有开启?

  3. 服务配置文件中使用’command1 && command2’开启两个服务后,无法正常访问服务
    systemctl如何在一个service中开启两个进程,这个目前还没搞明白,就很蠢地手动创建另一个服务吧!

对于pandas的Series数据,进行整体的数据变换是常见的事,包括类型转换,字符串切割,数据计算等等,如何高性能地完成这些数据变换,对于大规模的数据处理至关重要。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import numpy as np
import pandas as pd
import timeit

a = pd.Series(range(1000))

# %timeit a.apply(lambda x:x+2) 385us

def func1(x):
return x + 2

# %timeit func1(a) 88us

# %timeit a.astype('str') 524us

def func2(x):
return str(x)

# %timeit func2(a) 383us

b = pd.Series(['abcdefg' for i in range(1000)])

# %timeit b.str[3:5] 287us

def func3(x):
return x[3:5]

# func3(b) mistake

# 3 abcdefg
# 4 abcdefg
# dtype: object

series作为函数参数传入

series作为函数参数传入,由于未指定函数参数类型,因而该函数可以传入标量,也可以传入向量,传入向量则为向量运算。但需要注意的是,对于[]切片运算,如果传入的是向量,并不会对内部标量进行切割,而是对向量本身进行切割,这也导致了执行func3(b)的时候,没能达成我们想要的目标。由于是向量运算,这种方式执行的速度比较快。

series作为主体,调用函数

series作为主题,通过.func的形式调用函数,这种方式的速度较慢,耗时较长。尤其是通常使用的.astype.apply,会降低运行效率。

  • strpython的内建数据类型

Pandas Series 字符串操作

pandas的series内元素为str类型时,如果需要对整列的字符串进行变换,是无法直接调用字符串函数的,如[]截取操作,count计数,split分割操作等。

1
s = pd.Series(['A','b','C','bbhello','123',np.nan,'hj'])
1
2
3
4
5
6
7
8
0          A
1 b
2 C
3 bbhello
4 123
5 NaN
6 hj
dtype: object
1
2
type(s)
<class 'pandas.core.series.Series'>

s[0:1]实际上截取的是series的第一个元素,即A,而不是所有数据的第一个字母组成的series. 使用s.count('b')会提示非法调用。

为了实现序列元素的批操作,可以将series转化为strings.StringMethods.

1
2
type(s.str)
<class 'pandas.core.strings.StringMethods'>

再对s.str进行字符串操作就可以成功了。如

1
2
3
4
5
6
7
8
9
s.str.count('b')
0 0.0
1 1.0
2 0.0
3 2.0
4 0.0
5 NaN
6 0.0
dtype: float64

如何对Series进行内部元素数据类型转换,可以使用s.astype('')来实现。

经过对办公室电脑一系列猛如虎的操作(安装rdpwrapper、升级企业版、升级专业版)但依旧无法远程连接rdp之后,我几乎放弃了rdp这条路,无奈地向向日葵投降。虽然能够通过网云穿和utools NAT来访问办公室电脑的jupyter服务,但处理起来数据总归是不太爽。看看高额的蒲公英rdp映射服务,还是放弃了氪金。然而,俗话说,“有志者,事竟成”,在不懈的坚持下,还是成功地得以在家连上办公室的电脑。Bingo!

远程桌面的访问其实分为三个部分:

远程桌面服务器的搭建

其实用搭建这个词不算很合适,但一时找不到合适的词,暂用此。win10家庭版比较尴尬的一点是,并不自带远程桌面服务器,只有企业版和专业版提供。尽管我们可以用GithubRDP wrapper来‘曲线救国’,但在当时测试时,也是bug连连,及其烦人。为了省事起见,先是用密钥升级了企业版,又用密钥升级了专业版…(我也不懂为啥当初有这种神奇操作)。考虑到使用的是公司的电脑,会不会产生法律风险。。。暂时还不知道,先不管了。

公网ip

这一步也是最为烦人的一步。我之前的vps服务器基本到期,没有额外的公网ip做映射。网云穿等一些列服务商也由于政策原因(真的,还是接口?),关闭了免费的3389映射服务,并将其设为收费专线服务,一年几百大洋,太黑了。一想到自己搭建vps,还得买主机,配置frp,妈耶,要疯了。

后来发现了知乎上有人推荐的两款工具,SakuraLauncherZeroTiger. 前者是基于frp,开放了免费的frp服务线路,后者应用VPN异地组网技术。简单的设置后,即可实现公网ip的映射。

rdp服务开启

理论上来说,以上两步完成之后,就已经可以愉快地远程办公了。但很不幸,failed。

防火墙的问题?关闭防火墙也不行。允许应用通过防火墙?该通过不该通过的都通过了也不行… = =

看着frp log不断地报错,心都要碎了。一直拒绝、拒绝、拒绝连接。以为是有其他应用抢占3389端口,但用 netstat -ano | findstr 3389 一直为空。

此时,灵光一现,这他喵不会是没有开启远程桌面服务导致的吧?然后赶快把本机执行了一下上面命令:

upload successful

你说尴尬不尴尬,办公室那台,没有开启3389服务?什么鬼,我明明什么都没有做啊!

硬着头皮上网搜,“如何开启3389服务”,找到救命稻草cmd开启3389
启发下,打开注册表,定位到HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server,修改fDenyTSConnections的字段为0,即不阻止远程连接。

备注:修改端口可以通过修改HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\Wds\rdpwd\Tds\tcp字段PortNumber来实现。

 总结

回顾这一路,也是坑位连连。有系统的限制、网络资源的限制以及潜在的各种深坑。其中注册表那部分最初最令人困惑。怀疑是从家庭版升级到企业版后,安全策略会禁止远程访问,导致注册表字段修改。而升级到专业版后,则继承了这一点。表现为系统设置处显示可用,但本地并没监听3389端口,导致实际无法连接。
upload successful

今天在黑翼实习的过程中,廖师兄提到接下来数据处理要放到linux下的原因是数据解压的考虑。观察数据压缩的格式为7z后缀,而windows其实是有7z压缩软件的,相比能够通过命令行的形式来实现解压缩,从而结合脚本完成批量解压。

数据处理用的语言为python,最初的想法是调用python的逻辑来实现解压,后来觉得又没有太大的必要。因而考虑用bat脚本来实现。

7z的使用说明如下:

简介

7z,全称7-Zip, 是一款开源软件。是目前公认的压缩比例最大的压缩解压软件。

退出代码

  • 0 : 正常,没有错误;
  • 1 : 警告,没有致命的错误,例如某些文件正在被使用,没有被压缩;
  • 2 : 致命错误;
  • 7 : 命令行错误;
  • 8 : 没有足够的内存;
  • 255 : 用户停止了操作;

使用语法

7z <命令行> [<选项>…] <基本档案名称> [<参数变量>…]

  • 在方括号内的表达式(“[” 和 “]”之间的字符)是可选的。
  • 在书名号内的表达式(“<” 和 “>”之间的字符)是必须替换的表达式(而且要去掉括号)。

7-Zip 支持和 Windows 相类似的通配符:

  • “*”可以使用星号代替零个或多个字符。
  • “?”可以用问号代替名称中的单个字符。

如果只用*,7-Zip 会将其视为任何扩展名的全部文件。

命令及实例

  1. a 添加文件到压缩档案。

    • 7z a archive1.zip subdir\ :增加subdir文件夹下的所有的文件和子文件夹到archive1.zip中,archived1.zip中的文件名包含subdir\前缀。
    • 7z a archive2.zip .\subdir* :增加subdir文件夹下的所有的文件和子文件夹到archive1.zip中,archived2.zip中的文件名不包含subdir\前缀。
    • cd /D c:\dir1\
    • 7z a c:\archive3.zip dir2\dir3\ :archiive3.zip中的文件名将包含dir2\dir3\前缀,但是不包含c:\dir1前缀。
    • 7z a Files.7z *.txt -r : 增加当前文件夹及其子文件夹下的所有的txt文件到Files.7z中。
  2. b 测试 CPU 运行速度及检查内存错误。

  3. d 从压缩档案删除文件。

    • 7z d archive.zip *.bak -r :从archive.zip中删除所有的bak文件。
  4. e 从压缩档案中释放文件到当前目录中。或者到指定的输出文件夹。输出文件夹设置可以通过 -o (设置输出文件夹) 选项来更改。此命令会将所有被释放的文件放置到一个文件夹。如果您想使用完整路径释放文件,您必须使用 x (完整路径释放) 命令。

    • 7z e archive.zip :从压缩档案 archive.zip 中释放所有文件到当前文件夹。
    • 7z e archive.zip -oc:\soft *.cpp :从压缩档案 archive.zip 中释放 *.cpp 文件到 c:\soft 文件夹。
  5. l 列出压缩档案内容。

    • 7z l archiv.zip :列出压缩档案 archive.zip 的内容。
  6. t 测试压缩档案文件的完整性。

    • 7z t archive.zip *.doc :在压缩档案 archive.zip 中测试 *.doc 文件的完整性。
  7. u 在压缩档案文件中使用较新的文件替换掉较旧的文件。

    • 7z u archive.zip *.doc :在压缩档案 archive.zip 中更新 *.doc 文件。
  8. x 在当前目录中,使用完整路径从压缩档案中释放文件.或者到指定的输出文件夹。
    -7z x archive.zip :从压缩档案 archive.zip 中释放所有文件到当前文件夹。
    -7z x archive.zip -oc:\soft *.cpp :从压缩档案 archive.zip 中释放 *.cpp 文件到 c:\soft 文件夹。

更多的选项

  1. –在命令行中使“–”后的选项开关“-”都失效。这样就允许在命令行中使用文件名以“-”开头的文件。

    • 7z t – -ArchiveName.7z :测试 -ArchiveName.7z 压缩档案.
  2. -i 指定压缩时附加文件或一类文件。此选项可附件添加多个类型。

    • i[] 其中为可以为r[- | 0](具体的-r选项见后面-r),可以为@{listfile} | !{wildcard}。
    • 7z a -tzip src.zip .txt -ir!DIR1\.cpp :从当前目录中添加 *.txt 文件,和 DIR1 目录及其子目录中的 *.cpp 文件到 src.zip 压缩档案。
  3. -x 指定某一文件或某一类文件从操作中排除。此选项可同时排除多个类型。

    • x[] 其中为可以为r[- | 0](具体的-r选项见后面-r),可以为@{listfile} | !{wildcard}。
    • 7z a -tzip archive.zip .txt -x!temp. :添加除 temp.* 文件之外的所有 *.txt 文件到压缩档案 archive.zip。
  4. -o 指定释放文件的输出文件夹。此选项只能和释放命令配合使用。

    • 7z x archive.zip -oc:\Doc :从 archive.zip 压缩档案释放所有文件到 c:\Doc 文件夹。
  5. -r 递归子目录选项。

  6. -r 开启递归子目录。对于 e (释放)、l (列表)、t (测试)、x (完整路径释放) 这些在压缩档案中操作的命令, 会默认使用此选项。

  7. -r- 关闭递归子目录。对于 a (添加)、d (删除)、u (更新) 等所有需扫描磁盘文件的命令,会默认使用此选项。

  8. -r0 开启递归子目录。但只应用于通配符。

    • 7z l archive.zip -r- *.doc :列出在 archive.zip 压缩档案中根目录下的 *.doc 文件。
    • 7z a -tzip archive.zip -r src*.cpp src*.h :将 src 目录及其子目录中的 *.cpp 及 *.h 文件添加到 archive.zip 压缩档案。
  9. -t 指定压缩档案格式。指定压缩档案格式。它们可以是:zip、7z、rar、cab、gzip、bzip2、tar 或其它格式。而 默认值是 7z 格式。

    • 7z a -tzip archive.zip *.txt :使用 zip 格式从当前目录中添加所有 *.txt 文件到压缩档案 archive.zip。
  10. -y 使 7-Zip 执行命令时的大多数提示失效。您可以使用此选项来阻止在 e (释放) 和 x (完整路径释放) 命令中文件覆盖时的提示。

    • 7z x src.zip -y :从 src.zip 释放所有文件。所有的覆盖提示将被阻止且所有相同文件名的文件将被覆盖。
  11. -v指定分卷大小。

    • {Size}[b | k | m | g]
    • 指定分卷大小,可以使用字节、KB(1 KB=1024 字节),MB(1 MB = 1024 KB)或 GB(1 GB = 1024 MB)。如果您只指定了 {Size},7-zip 将把它视为字。
    • 7z a a.7z *.txt -v10k -v15k -v2m : 创建 a.7z 分卷压缩档案。第一个分卷为 10 KB,第二个为 15 KB,剩下全部为 2 MB。
  12. -p 指定密码。

    • 7z x archive.zip -psecret :将设有密码“secret”的压缩档案 archive.zip 中所有文件释放。
  13. -ao 指定在释放期间如何覆盖硬盘上现有的同名文件。

    • 语法:-ao[a | s | u ]
    • -aoa 直接覆盖现有文件,而没有任何提示。
    • -aos 跳过现有文件,其不会被覆盖。
    • -aou 如果相同文件名的文件以存在,将自动重命名被释放的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
    • -aot 如果相同文件名的文件以存在,将自动重命名现有的文件。举个例子,文件 file.txt 将被自动重命名为 file_1.txt。
    • 7z x test.zip -aoa :从压缩档案 test.zip 中释放所有文件并却不做提示直接覆盖现有文件。
  14. -an 不解析命令行中的 archive_name 区域。此选项必须和 -i (附加文件) 开关一起使用。比如您为压缩档案使用列表文件,您就需要指定 -ai 选项,所以您需要禁止解析命令行中的 archive_name 区域。
    实例见后面的-ai和-ax中。

  15. -ai 指定附加文件,包括压缩档案文件名及通配符。此选项可同时附加多个类型。

    • ai[] 其中为可以为r[- | 0](具体的-r选项见后面-r),可以为@{listfile} | !{wildcard}。
    • 7z t -an -air!*.7z : 在当前目录及子目录下测试 *.7z 压缩档案。
  16. -ax 指定必须从操作中排除的压缩档案。此选项可同时排除多个类型。

    • ax[] 其中为可以为r[- | 0](具体的-r选项见后面-r),可以为@{listfile} | !{wildcard}。
    • 7z t -an -ai!.7z -ax!a.7z :测试除 a*.7z 之外的 *.7z 压缩档案。

更多的不常用的选项,可以查看帮助。例如:-m设置压缩算法;-scs 设置要压缩的文件的列表文件的字符集;-seml通过电子邮件发送压缩档;-sfx创建自释放档;-si从标准输入读入数据,-so从输出到标准输出;-slp设置大内存模式;-slt显示技术信息;-ssc设置区分大小写;-ssw压缩正在写入的文件;-u更新选项。

7z -e 后面跟的是相对路径,7z -x后面跟的是绝对路径。

下面是bat的脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
@echo off
REM %cd% 终端当前目录
REM %%~dp0 为脚本所在目录
REM %%用在脚本中
REM %s用在命令行中
REM 7z x 后面跟绝对路径
REM 7z e 后面跟相对路径
REM 7z -aos 表示若文件已存在,跳过解压
REM 两行cd 源于 7z x -aos %%s -o%%~dps 在for循环中无法正常执行,用反复进退目录的方式曲线救国。这么做效率会下降,以后再修正。
REM /R 表示递归搜索

set work_path="%cd%"
echo work_path=%work_path%
for /R %work_path% %%s in (*.7z.001) do (
cd %%~dps
7z x -aos %%s
cd %work_path%
)
  • REM 表示bat脚本的注释
  • 7z x -aos 表示 解压到当前目录
  • %%s表示与*.7z.001匹配的文件全路径
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
%I 引用I
%~I         - expands %I removing any surrounding quotes (")
%~fI - expands %I to a fully qualified path name
%~dI - expands %I to a drive letter only
%~pI - expands %I to a path only
%~nI - expands %I to a file name only
%~xI - expands %I to a file extension only
%~sI - expanded path contains short names only
%~aI - expands %I to file attributes of file
%~tI - expands %I to date/time of file
%~zI - expands %I to size of file

The modifiers can be combined to get compound results:
%~dpI - expands %I to a drive letter and path only
%~nxI - expands %I to a file name and extension only
%~fsI - expands %I to a full path name with short names only

在上面,给出了cmd下提取路径或文件名的一些操作,如果用在脚本中,%改为%%即可。其中I表示变量,在这里,我们用的是S.

晚饭

董必杰、郭爽什么身份,开会内容主要是什么?我参与的意义在哪里?

基金

晚饭时提及,项目可能要延期开展(这部分确认一下),确认是否可行,大概日期,需要准备什么,任职岗位及预期待遇,发展前景。

投资顾问

感兴趣的几个方向:

  1. 教育,感觉市场比较大,投资者对这个领域关注比较多,尤其是在线教育这个行业。
  2. 文娱,受众面比较广,受舆论、热评比较较大,需要对不同产品方向的受众有一定了解。
  3. 环保,新兴领域,受政府扶持较大。

教育依赖教育部,文娱依赖大企业,环保依赖政府机构。这几点都是初步的想法,有什么建议及推荐的方向,如果要做到的话,需要准备些什么?

会计

用友,能否进,怎么进,做什么,需要准备什么?

管理方向的会计

根据简历适合投递什么岗位?

windows开机自启软件的方式有很多,有些可以通过软件自身设置完成,有些可以通过win10 自带任务管理完成。比较便捷的方式,直接把快捷方式移到指定目录即可。

C:\Users\[yourname]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

打开此目录的便捷方式为 打开运行,输入shell:startup.

upload successful

upload successful