title: 最长无重复子串
date: 2016-10-31 14:20:45

tags: 算法

对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。
给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。
测试样例:
“aabcb”,5
返回:3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class DistinctSubstring:
def longestSubstring(self, A, n):
# write code here
dic = {}
pre = -1
l = 0
ltmp = 0
for i in range(0,n):
if not dic.has_key(A[i]):
dic[A[i]] = i
ltmp = i - pre
else:
if i - dic[A[i]] < i - pre:
ltmp = i - dic[A[i]]
pre = dic[A[i]]
else:
ltmp = i - pre
dic[A[i]] = i
if ltmp > l:
l = ltmp
return l

终端环境配置

早就说要转移到vim上,无奈在vim修炼的第一级:“存活”上狗带了n次,昨天被志豪小盆友说工作效率低下很大原因是因为没有使用强大的工具,终于被拍醒,于是下定决心,怎么也要把这个这么有逼格的东西用起!在志豪(再一次上链接哈哈~)的帮助下,我现在终于在“存活”上迈进了一步~!
首先说明一些概念:
终端,即所谓的命令行界面,又称命令终端,用户输入shell命令用的窗口,跟Windows里的DOS界面差不多。我使用了iTerm2,它要比os x的terminal的功能强大
shell,Shell就是用户和操作系统之间的壳,中介,shell有很多种:bash,csh,zsh;shell将用户输入翻译为操作系统能处理的指令。shell提供了一些内置命令。
iterm2 目前发现了比终端多的一些功能

  • ⌘ + enter: 切换全屏
  • ⌘ + 数字: 切换标签页。⌘ + 方向键 按方向切换标签页。(之后发现了再补充~)

zsh
有强大的自动补全功能,github上有很多漂亮的主题
使用brew进行安装 brew install zsh
这个安装好之后再安oh-my-zsh,因为这个是之前安的,这里先不说具体安装步骤了,使用chsh -s /bin/zsh切换到zsh上,重启并开始使用zsh (打开一个新的终端窗口便可…)

等等。。。这样根本体现不出什么强大?嗯,是的,接下来安装三大插件YouCompleteMe、Ctrl P、autojump,前两个我是安装了k-vim他把这些都安好了,照着这个教程一步一步走就好,安装完成之后检查一下是否可以使用,我的YouCompleteMe、Ctrl P在安装完之后都不可以正常使用,这个时候分别去官网查看一下应该如何修改配置文件
vim .vimrc.bundles

1
2
let g:ctrlp_map = '<c-p>'
let g:ctrlp_cmd = 'CtrlP'

cd ~/.vim/bundle/YouCompleteMe

1
./install.py

这个下的很慢。。。
autojump
之前安装过,但是不能使用,重新安装,安装过程会有提示,按照提示来,会要求卸载重新安,而且要在
vim ~/.zshrc 后添加这样一句话:

[[ -s $(brew --prefix)/etc/profile.d/autojump.sh ]] && . $(brew --prefix)/etc/profile.d/autojump.sh

未完待续。。。

python 实现链表的反转

从头开始遍历,每一个节点的next指向它的前一个节点。

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
33
34
35
36
37
38
39
40
41
42
43
44
class ListNode:
def __init__(self,x):
self.val=x
self.next=None

def nonrecurse(head):
if head is None or head.next is None:
return head
pre = None
cur = head
h = head
while cur:
h=cur
tmp = cur.next
cur.next = pre
pre = cur
cur = tmp
return h

head = ListNode(1)
p1=ListNode(2)
p2=ListNode(3)
p3=ListNode(4)
head.next = p1
p1.next = p2
p2.next = p3
p=nonrecurse(head)
while p:
print p.val
p=p.next



head = ListNode(1)
p1=ListNode(2)
p2=ListNode(3)
p3=ListNode(4)
head.next = p1
p1.next = p2
p2.next = p3
p=nonrecurse(head)
while p:
print p.val
p=p.next

晒黑了

有一周没有更新博客了,上次写博客的第二天和实验室一起去了水魔方,今年首晒献给了那一天,现在身上晒出了一身泳衣,脸也黑了,感觉好亏,居然只玩了一天就被晒成了这样,不过玩的还算是开心,从一个很高的地方滑下来,我以为会很害怕,可是水的作用减弱了失重的感觉,完全不害怕,那天很累,冲浪比较有意思。
看看其他人提交的mr,也学到了写东西:
小儿的一个mr:

result = dict()
for m in (g_members + p_members):
    id = m.get('id')
    if not result.get(id):
        result[id] = m

return Response(json.dumps(result.values()), mimetype='application/json')

djando项目部署

这周又要过去了,公司里的提测项目我自己这周并没有多大进展,增加了邮箱的合法性检查,可以异步发送邮件了的功能,总之代码量是比较少的,帮着另外两个实习生把提测项目的环境搭建起来跑通然后给他们讲了讲我写的代码,和他们一起实现了当有一个mr提交时检测所有mr是否有冲突,有的话就发送邮件,其实跟我以前的很像,都是调用gitlab提供的接口。
这周基本上就是干了这些,我觉得我得好好想想了,这样进步真的是挺小的。
这周在学校是把实验室的项目搭在了我以前的windows电脑上了,感觉也就这点收获吧,差不多弄了三天,每天下班回来,因为电脑不能上无线,坐在金津那里用网线,这样坐在地上终于把项目跑起来了。
1、首先在windows上安装ubantu:
本来打算用双系统,分好区之后换了好几次镜像文件都是一进安装电脑就没有反应了,在实验室弄了好久,都无效,回宿舍梦楠又帮我弄半天还是不行,于是我放弃了双系统,选择了虚拟机。
用vmware简直是简单了许多。。。
首先安装vmware,就是像普通软件安装一样就行。然后安装iso文件。好像也没有遇见什么坑,ubantu就算是安好了吧.
2、在ubantu上安装各种所需软件。

<1>首先安装pip
sudo apt-get install python-pip python-dev build-essential
sudo pip install –upgrade pip

<2>使用pip安装django没有成功
所以我在pip 安装好之后在django官网下载django安装包,解压 python setup.py install

<3>用pip安装mysql
sudo apt-get install mysql-server
基本命令:
mysql -uroot -p
show databases;
quit

<4>要把我的mac上的项目考在ubantu上,使用ssh协议,这里的坑比较多
首先将网络从NAT选成桥接
在ubantu上安装ssh
sudo apt-get install openssh-server
安装好后在mac上
sudo scp -r /Users/taoran/Desktop/Navigation taoran@10.203.32.82:/home/taoran
这样就讲项目考在了ubantu上

<5>此时还没有导入数据库 将mac上的数据库到处.sql文件
mysqldump -u root -p new_nav > new.sql
用scp考在ubantu上
ubantu上mysql -uroot -p
create database new_nav;
use new_nav;
source /home/taoran/new.sql

<6>ubantu上需要安装 sudo apt-get install pyhton-mysqldb这个好像是python操作数据库用的

<7>接下来就可以试着运行django了
python manage.py makemigrations
python manage.py makemigrate
python manage.py runserver

<8>运行会发现一些第三方包没有
pip install balabala…
嗯 现在已经很晚了,明天实验室一起去水魔方玩,我还是赶紧睡觉吧。

git分支

创建分支并切换:git checkout -b dev
这个命令相当于执行了两步:1、git branch dev 2、切换分支:git checkout dev
查看分支:git branch
合并某分支到当前分支:git merge dev
删除分支:git branch -d dev


title: git版本回退的总结
date: 2016-07-24 11:04:53

tags:

回退的话,有三种情况,第一种只是工作区有了变化,想回到最近一次提交的状态;第二种情况是,已经add到了暂存区,想要回到add之前;第三种情况是已经commit了,怎样回退。
首先来看第一种情况,即工作区的回退。
使用git checkout – file 就回到了最近一次add的状态
接下来看第二种情况,已经add了怎么办呢?
首先,git reset HEAD file 把暂存区的修改回退到工作区 
然后,git checkout – file 丢弃工作区的修改
最后一个啦。如果已经commit了呢?
git reset –hard HEAD^这是回退到上一版本 HEAD~100
git reset –hard commit_id
git log 查看现在版本库的状态
git reflog 查看命令历史,以便确定要回到未来的哪个版本。

字典的update

我以前定义dict是这样定义的:

1
a={'key':'value'}

今天leader给我说了更好的方法:

a=dict(a=1)

还跟我说了一个很好的东东,如果想在原有的字典上追加新的使用update

b=dict(b=1)
b.update(a)

这样b就变成了{‘a’:1,’b’:2}
另外附上我的日报:
hi leader:

今日进度:
提测工具项目:
1、完善了前端的界面,学习Bootstrap框架,使用了它的一些标签和样式,使得现在的界面比以前好看了很多
2、修改了一下以前的代码,以前把所有的mr都显示出来了,现在只显示opened的mr
阅读leader推荐的两篇文章:
1、google coding style
2、https://www.v2ex.com/t/292171#reply25关于对变量命名的一篇博客。
马越说啦,这周看完google coding style

你看你又懵了

我今天把在字符串中的变量当作了变量(应该是用{key}括起来然后.format(key=value)
今天(07.12)
1、继续完善了arctic-ocean(提测工具)的代码,把url的参数放到了环境变量以及修改了一些格式。
刚开始我的代码是这样写的:

1
url = (API_PREFIX + 'groups/id/projects?project_token={private_key}').format(private_key = PRIVATE_KEY )

经过leader提点后,把id放在format中,把private_key当作参数传入,就是说要写的灵活些。
修改之后:

1
2
3
PRIVATE_KEY_PAYLOAD  = {'private_token': PRIVATE_KEY}}
url = (API_PREFIX + 'groups/{group_id}/projects').format(group_id=id)
response = requests.get(url, params=PRIVATE_KEY_PAYLOAD)

2、当一个字符串太长的时候,可以这样来把当分成两行:对字符串加上括号,然后在要分隔的地方加上引号(我看了马越给我发的关于代码风格的链接,加了括号好像直接在想要换行的地方换行就好,不用加引号),点回车,这样分隔起来比我以前加”\”的办法要美观很多(如果不加括号直接回车就会有‘\’)。
3、关于代码风格,leader推荐了
https://google.github.io/styleguide/pyguide.html,还没有看完,回去再看看。

arctic-ocean总结

这一周以来,就是做这个项目了,遇到很多坑,学到很多东西。
这个项目设计一下知识点:
1、http/api

<1>首先,看gitlab的help,api部分,里面对于访问group,project,merge_request的url有介绍,可以利用postman模拟访问,但是后面都要跟上自己的token
比如这样的url:code.vipkid.com.cn/lib/api/groups?private_token=R7sdfhef-d5jZQ6sfjwR

<2>请求用的是requests,马越说这个是业界口碑很好的,什么urllib之类的不如这个好

1
2
3
response = requests.get(url)
response.json()
r = requests.post(url, data={'body': body})

2、markdown
markdown其实就是一个字符串,可以在编辑器里传入一个字符串,然后会解析成markdown的格式,刚开始我用的就是字符串拼接的方式,在上篇博客中有所介绍,后来用了三个引号,虽然本质相同,但是方便很多,专门建一个模版,然后导入,使用string({key}).format(key=value)
3、python web
当然这是web开发项目,涉及到表单之类的知识。
4、e-mail
邮件部分是学长写的,我直接导入调用就行了

from envelopes import Envelope

通过这次项目,学到很多有关编程优雅发面的东西:

<1>关于url的命名,最好是要让人能够通过url看出这一个页面时用来做什么的 比如:

@bp.route('/group/<id>/projects') 
@bp.route('/group/<id>/project/<pid>/mr')

<2>可以重复利用的代码写在libs中,这样不仅可以重复利用,也可以使代码看起来很简洁易懂。比如对于gitlab接口的操作我都写在了libs\api\gitlab.py中。

<3>对gitlab的请求url前缀是相同的 那么可以定义API_PREFIX = ‘https://code.vipkid.com.cn/api/v3/',然后每个url字符串拼接,马越说这样是最好的注释,别人可以看懂这是什么。

今天早上马越给我看了一个它们现在正在写的程序,代码封装的特别好,不会使用requests.get(url)这样的写法,因为这样不能让人知道get了些什么,有什么是可以get到的,他们使用了Field entity 这些我还不懂,也许以后会慢慢接触到吧!
还有就是提交代码的时候,不要提交.pyc 文件 .env文件!
可能还有些东西,以后想起来再加上吧。