栗子

Manacher(马拉车)————O(n)回文子串

可紊 提交于 2020-03-22 07:20:29
Manacher 一、背景 1975年,Manacher发明了Manacher算法(中文名:马拉车算法),是一个可以在 O(n)的复杂度 中返回字符串s中 最长回文子串长度 的算法,十分巧妙。 让我们举个栗子,栗子: 1.字符串:abbababa 最长回文子串:5(abb ababa ) 2.字符串:abcbbabbc 最长回文子串:7(ab cbbabbc ) 3.字符串:abccbaba 最长回文子串:6( abccba ba) 传统方法是,遍历每个字符,以该字符为中心向两边查找。时间复杂度为 O(n^2) ,效率很差; 而这个神奇的Manacher算法将复杂度提升到了 O(n)。 来一起瞅一瞅它是如何工作的吧。 二、算法过程分析 回文分为奇回文(ababa)和偶回文(abba),这里比较难以处理,我们使用一个 小 (sao) 技 (cao) 巧 (zuo) ( 很重要 )。我们将字符串首尾和每个字符间插入一个字符( 注意 :这个自符在串中并未出现)例如:'#'. 栗子!栗子! s='abbadcacda'先转化成s_new='$#a#b#b#a#d#c#a#c#d#a#\0'('$'与'\0',是边界,下面的代码中可以看到) 这样原串中的偶回文(abba)与奇回文(adcacda),变成了(#a#d#d#a#)与(#a#d#c#a#c#d#a#)两个 奇回文 。 定义数组p[

JS中的栈和堆

回眸只為那壹抹淺笑 提交于 2020-03-20 01:06:22
一.栈和堆 栈(stack) :栈会自动分配内存空间,会自动释放,存放 基本类型 ,简单的数据段,占据固定大小的空间。 基本类型 :String,Number,Boolean,Null,Undefined 堆(heap) :动态分配的内存,大小不定也不会自动释放,存放 引用类型 ,指那些可能由多个值构成的对象,保存在堆内存中,包含引用类型的变量,实际上保存的不是变量本身,而是指向该对象的指针。 引用类型 :Function,Array,Object 二.区别 栈 :所有在方法中定义的变量都是放在栈内存中,随着方法的执行结束,这个方法的内存栈也自然销毁。 优点:存取速度比堆快,仅次于直接位于CPU中的寄存器,数据可以共享; 缺点:存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。 堆 :堆内存中的对象不会随方法的结束而销毁,即使方法结束后,这个对象还可能被另一个引用变量所引用(参数传递)。创建对象是为了反复利用,这个对象将被保存到运行时数据区。 三.栈和堆的溢出 栈 :可以递归调用方法,这样随着栈深度的增加,JVM维持着一条长长的方法调用轨迹,知道内存不够分配,产生栈溢出。 堆 :循环创建对象,通俗点就是不断的new 一个对象。 下面来看看传值和传址的区别 其实这两者区别就是基本类型和引用类型的区别,话不多说看栗子 var a = [1,0,9,8,7]; var b = a;

linux 系统文件目录颜色及特殊权限对应的颜色

不问归期 提交于 2020-03-11 17:28:59
什么决定文件目录的颜色和背景? 颜色 说明 栗子 权限 白色 表示普通文件 蓝色 表示目录 绿色 表示可执行文件 浅蓝色 链接文件 黄色 表示设备文件 红色 表示压缩文件 红色闪烁 表示链接的文件有问题 灰色 表示其它文件 可以用字符表示文件的类型(权限中的首字符) -:普通文件 d:目录文件 l:链接文件 b:块设备文件 c:字符设备文件 p:管道文件 s:套接字文件 三种背景颜色: 红色背景 : 特殊权限Set User ID,占属主的x位,仅对可执行的程序有意义,当其他用户执行带SUID标记的程序是,所有用户具有此程序的属主的身份和相应权限,例如:其user在此(若属主为root)创建文件或目录,属主依然是root,而不是user。 栗子: chmod u+s test.txt 黄色背景 : 特殊权限Set Group ID,占属组的x位,对可执行的程序和目录有效,例如:其user2在此目录(若属组为user1)创建文件或目录,属组依然是user1,而不是user2。 栗子: chmod g+s test.zip (应该是棕黄色吧……) 绿色背景 :特殊权限Sticky Bit(粘滞位),占其他(other)的x位,未设置粘滞位时普通用户可以删除其他人的文档,设置粘滞位后普通用户不能删除其他人的文档,只能删除自己的。 栗子: 先:chmod 777 tmp ,再:chmod

python 3操作文件的异常处理

心不动则不痛 提交于 2020-01-14 18:12:12
在执行python脚本时,正常运行的时候,也可能发生错误,返回的错误类型就是报错信息,我们可以针对其返回的错误类型执行相应的语句,错误类型有很多,如:ValueError、TypeError、NameError、ZeroDivisionError..... 1、try / except 来个简单的语法,如下: while True: try: x = int(input('请输入一个数字:')) break except ValueError: print('您输入的不是一个数字,请再次尝试!') 执行结果如下: 请输入一个数字:d 您输入的不是一个数字,请再次尝试! 请输入一个数字:3 try语句按照如下的方式工作: 首先,执行try子句(在关键字try和except之间的语句)。 如果没有发生异常,则忽略except子句,try子句执行后结束。 如果在执行try子句的过程中发生了异常,那么try子句余下的部分将会被忽略,如果异常类型和except之后定义的异常类型相同,则会执行except关键字下的子句。 如果一个异常没有与任何except匹配,那么这个异常将会传递给上层的try中。 一个try语句可以包含多个except子句,分别来处理不同的特定异常,但是最多只有一个except分支会被执行。 处理程序将只针对对应的try子句中的异常进行处理

Sublime Text3快捷键大全

故事扮演 提交于 2020-01-07 22:47:08
选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。 Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。 Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行。 Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。举个栗子:快速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。 Ctrl+M 光标移动至括号内结束或开始的位置。 Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能快速向下插入一行。 Ctrl+Shift+Enter 在上一行插入新行。举个栗子:即使光标不在行首,也能快速向上插入一行。 Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。 Ctrl+Shift+] 选中代码,按下快捷键,展开代码。 Ctrl+K+0 展开所有折叠代码。 Ctrl+← 向左单位性地移动光标,快速移动光标。 Ctrl+→ 向右单位性地移动光标,快速移动光标。 shift+↑ 向上选中多行。 shift+↓ 向下选中多行。 Shift+← 向左选中文本。 Shift+→ 向右选中文本。 Ctrl+Shift+←

Sublime Text3 快捷键

百般思念 提交于 2020-01-03 10:18:58
Sublime Text3快捷键 多用下,多看下,就熟了~~ 选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。 Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。 Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行。 Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。举个栗子:快速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。 Ctrl+M 光标移动至括号内结束或开始的位置。 Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能快速向下插入一行。 Ctrl+Shift+Enter 在上一行插入新行。举个栗子:即使光标不在行首,也能快速向上插入一行。 Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。 Ctrl+Shift+] 选中代码,按下快捷键,展开代码。 Ctrl+K+0 展开所有折叠代码。 Ctrl+← 向左单位性地移动光标,快速移动光标。 Ctrl+→ 向右单位性地移动光标,快速移动光标。 shift+↑ 向上选中多行。 shift+↓ 向下选中多行。 Shift+← 向左选中文本。 Shift

Sublime Text3 快捷键

拜拜、爱过 提交于 2020-01-03 10:18:40
选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个同样的文本。 Alt+F3 选中文本按下快捷键。就可以一次性选择所有的同样文本进行同一时候编辑。举个栗子:高速选中并更改所有同样的变量名、函数名等。 Ctrl+L 选中整行。继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。 Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,就可以同一时候编辑这些行。 Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。 举个栗子:高速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。 Ctrl+M 光标移动至括号内结束或開始的位置。 Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能高速向下插入一行。 Ctrl+Shift+Enter 在上一行插入新行。 举个栗子:即使光标不在行首,也能高速向上插入一行。 Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。 Ctrl+Shift+] 选中代码,按下快捷键,展开代码。 Ctrl+K+0 展开全部折叠代码。 Ctrl+← 向左单位性地移动光标,高速移动光标。 Ctrl+→ 向右单位性地移动光标。高速移动光标。 shift+↑ 向上选中多行。 shift+↓ 向下选中多行。 Shift+← 向左选中文本。 Shift+→ 向右选中文本。 Ctrl+Shift+

Sublime Text3快捷键大全

ぃ、小莉子 提交于 2020-01-03 10:18:22
选择类 Ctrl+D 选中光标所占的文本,继续操作则会选中下一个相同的文本。 Alt+F3 选中文本按下快捷键,即可一次性选择全部的相同文本进行同时编辑。举个栗子:快速选中并更改所有相同的变量名、函数名等。 Ctrl+L 选中整行,继续操作则继续选择下一行,效果和 Shift+↓ 效果一样。 Ctrl+Shift+L 先选中多行,再按下快捷键,会在每行行尾插入光标,即可同时编辑这些行。 Ctrl+Shift+M 选择括号内的内容(继续选择父括号)。举个栗子:快速选中删除函数中的代码,重写函数体代码或重写括号内里的内容。 Ctrl+M 光标移动至括号内结束或开始的位置。 Ctrl+Enter 在下一行插入新行。举个栗子:即使光标不在行尾,也能快速向下插入一行。 Ctrl+Shift+Enter 在上一行插入新行。举个栗子:即使光标不在行首,也能快速向上插入一行。 Ctrl+Shift+[ 选中代码,按下快捷键,折叠代码。 Ctrl+Shift+] 选中代码,按下快捷键,展开代码。 Ctrl+K+0 展开所有折叠代码。 Ctrl+← 向左单位性地移动光标,快速移动光标。 Ctrl+→ 向右单位性地移动光标,快速移动光标。 shift+↑ 向上选中多行。 shift+↓ 向下选中多行。 Shift+← 向左选中文本。 Shift+→ 向右选中文本。 Ctrl+Shift+←

举个栗子!Tableau技巧(21):轻松使用参数实现数据增长分析

情到浓时终转凉″ 提交于 2019-12-30 20:37:03
使用电子表格做数据增长分析时,需要先在表格里增加一个现实对比结果的字段,然后使用函数计算得到分析结果。接着,再把得到的分析结果制作成图表,往往事倍功半。 并且,假如你的数据不是excel文件,而是系统或者数据库里的数据,并且数据量非常庞大,事情可就没有那么简单了。 怎样能轻松实现数据增长分析呢? 其实,在Tableau里面,你只需要使用一个参数。 本期《举个栗子》,阿达要给大家分享的Tableau技巧是:轻松使用参数实现数据增长分析。 该栗子以实现数据的同比增长分析为应用场景,具体步骤如下: 创建日期参数 创建计算字段 将分析维度拉到工作表 把你想要分析的维度拖到工作表,就可以开始分析同比增长情况了。例如:想分析2016年产品的同比增长,就可以得出下面的分析结果。 如此,一个数据同比增长分析就完成了。是不是很简单?赶紧打开你的Tableau,试试看吧! 文章部分信息来源于网络,如有侵权请告知 来源: CSDN 作者: 阿达_优阅达 链接: https://blog.csdn.net/weixin_45588393/article/details/103770634

设计模式六大原则(PHP)

余生长醉 提交于 2019-12-10 04:28:26
设计模式的目的是为了更好的代码重用性,可读性,可靠性和可维护性。常用的六大设计模式有:单一职责原则(SRP),里氏替换原则(LSP),依赖倒转原则(DIP),接口隔离原则(ISP),迪米特法则(LOD),开闭原则(OCP)。 1.单一职责原则(Single Responsibility Principle) 该原则是针对类来说的,即一个类应该只负责一项职责。假设有一个部门的类叫做T,他的下面有两个职责的方法叫做P1,P2。假如P1的职责发生改变时去修改这个部门类T,那么有可能造成职责P2发生故障。 举个栗子: 我们用动物呼吸的场景来表现一下 输出结果: 但是呢,我们发现并不是所有的动物都是呼吸空气的,比如说鱼它是呼吸水的。根据SRP原则,我们应该将Animal类分为陆地动物和海洋生物,如下所示: 但是我们发现这样修改花销很大,既要将原来的类分解,又要修改客户端。而直接修改Animal类则违背了单一职责原则,但花销很小 如下所示: 这种修改方式没有改变原来的方法,而是在类中新加了一个方法,这样虽然违反了单一职责原则,但是在方法级别上却是符合单一职责原则的。在实际的编程中,只有逻辑足够简单,才可能在代码级违反单一职责原则;只有类中的方法数量足够少,才可以在方法级别上违反单一职责原则。 遵循单一职责的优点: (1)降低类的复杂度,一个类只负责一项职责。 (2)提高类的可读性,可维护性。