LeetCode Hard 1

周二算法题

先看看leetcode上第一道标记为Hard的题

Median of Two Sorted Arrays

There are two sorted arrays nums1 and nums2 of size m and n respectively. Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)). You may assume nums1 and nums2 cannot be both empty.

Example 1:

nums1 = [1, 3]
nums2 = [2]

The median is 2.0
Example 2:

nums1 = [1, 2]
nums2 = [3, 4]

The median is (2 + 3)/2 = 2.5

就是找中位数,有点像,某个班级,男生一列,女生一列,都是按照从身高生序排列,要找出全班的身高的中位数。

以下就是我写的几个方法,思路都差不多,从两个数列中取出前n个数,假设n就是连个数列长度之和的一半。废话不多说,直接上代码

#!/usr/bin/python3

class Solution:
    def findMedianSortedArrays(self, nums1:List[int],nums2:List[int]) ->float:
        nums = nums1 + nums2
        nums.sort()
        n = len(nums)
        if n % 2 == 0:
            return (nums[n//2]+nums[n//2-1])/2
        else:
            return nums[n//2] 

    def findMedianSortedArraysNew(self, nums1:List[int],nums2:List[int]) ->float:
        n1 = len(nums1)
        n2 = len(nums2)    
        n = (n1+n2)//2
        i = 0
        pre = 0
        res = 0
        while i<=n :
            pre = res
            if len(nums1) == 0:
                res = nums2.pop()
            elif len(nums2) == 0:
                res = nums1.pop()
            elif nums1[-1] >=  nums2[-1]:
                res = nums1.pop()
            else:
                res = nums2.pop()
            i = i+1
        if (n1+n2) % 2 == 0:
            return    (pre+res)/2
        else:
            return pre 

    def findMedianSortedArraysNew2(self, nums1:List[int], nums2:List[int]) -> float:
        n1 = len(nums1)
        n2 = len(nums2)    
        n = (n1+n2)//2
        i = 0
        pre = 0
        res = 0
        j,k = 0,0
        while i<=n :
            pre = res
            if n1  == j:
                res = nums2[k]
                k = k+1
            elif n2 == k:
                res = nums1[j]
                j = j +1
            elif nums1[j] <=  nums2[k]:
                res = nums1[j]
                j = j +1
            else:
                res = nums2[k]
                k = k +1
            i = i+1
        if (n1+n2) % 2 == 0:
            return    (pre+res)/2
        else:
            return res        

本以为第一个方法是偷懒的方法(用到了系统的方法sort),效果可能不好;没想到后面两个自己写的方法,还不如第一个。

方法1  88 ms   12.9 MB python3
方法2  100 ms  12.9 MB python3
方法3  96 ms   12.8 MB python3

所以,查了以下python3中sort方法的实现,发现它用到了一个名为Timsort的算法 恩,关于这个算法,打算再写几篇文章。今天算是把注册很久的账号激活了,刷刷算法题,防止脑袋生锈。

https://leetcode.com/problems/median-of-two-sorted-arrays/
Runtime: 96 ms, faster than 88.25% of Python3 online submissions for Median of Two Sorted Arrays.
Memory Usage: 12.8 MB, less than 100.00% of Python3 online submissions for Median of Two Sorted Arrays.
Plantuml Introduce

慢慢发现在诸多技能中,coding是最不应该花时间的。 在代码编写前,和代码编写后的事情,往往才是重要的。 想清楚你要做什么,要怎么做,以及之后要达成什么样的目标,检验结果是否符合预期 这些事情,都应该比coding要重要。 没有人愿意去读你的代码,除非没办法。 想写一系列的pre coding 和 post coding 的文章。今天开个头,希望能持续写下去

UML–让你的需求清晰的法宝

首先说明,我不用图形界面拖拽控件来画流程图。诸如`Visio` `Precess On`我一律不用。
原因很简单,我认为拖拽的效率非常低,你大量的精力都花在元素是否对其,鼠标和键盘之间来回切换,
你反而不能集中精力去思考逻辑。还有一个原因,不利于复用和修改。

plantuml

plantuml是一个开源的工具,你可以用它来画流程图,用例图 类图等等。最令人满意的是,你可以用写代码的模式来“画”uml图。 比如:

1.创建一个demo.uml的文件,用你习惯的编辑器,编写如下内容:

    @startuml
    client->server: syn=1 seq=x
    note left
        客户端发送syn报文,
        发送序列号为x
    end note
    client<-server: syn=1 ack=x+1 seq=y
    note right
        服务端接受请求, 回复syn+ack报文,
        并置发送序列号为y,确认序列号为x+1
    end note
    client->server: ack=y+1 seq=z
    note left
        客户端发送ack报文,并置发送序列号为z
        确认序列号为y+1
    end note
    @enduml

2.下载plantuml.jar包

    http://sourceforge.net/projects/plantuml/files/plantuml.jar/download

3.把plantuml.jar移动到你乐意的路径下,并创建一个可执行文件plantuml文件

    linux下参考如下操作:
    mv ./plantuml.jar   /usr/local/bin/plantuml.jar
    touch /usr/local/bin/plantuml
    echo "#!/bin/bash" >> /usr/local/bin/plantuml
    echo "jar -jar /usr/local/bin/plantuml.jar $@" >> /usr/local/bin/plantuml
    chmod +x  /usr/local/bin/plantuml 

4.查看plantuml的帮助plantuml -h,结果如下

Usage: java -jar plantuml.jar [options] -gui
	(to execute the GUI)
    or java -jar plantuml.jar [options] [file/dir] [file/dir] [file/dir]
	(to process files or directories)

You can use the following wildcards in files/dirs:
	*	means any characters but '/'
	?	one and only one character but '/'
	**	means any characters (used to recurse through directories)

where options include:
    -gui		To run the graphical user interface
    -tpng		To generate images using PNG format (default)
    -tsvg		To generate images using SVG format
    -teps		To generate images using EPS format
    -tpdf		To generate images using PDF format
    -tvdx		To generate images using VDX format
    -txmi		To generate XMI file for class diagram
    -tscxml		To generate SCXML file for state diagram
    -thtml		To generate HTML file for class diagram
    -ttxt		To generate images with ASCII art
    -tutxt		To generate images with ASCII art using Unicode characters
    -tlatex		To generate images using LaTeX/Tikz format
    -tlatex:nopreamble	To generate images using LaTeX/Tikz format without preamble
    -o[utput] "dir"	To generate images in the specified directory
    -DVAR1=value	To set a preprocessing variable as if '!define VAR1 value' were used
    -Sparam1=value	To set a skin parameter as if 'skinparam param1 value' were used
    -r[ecurse]		recurse through directories
    -I/path/to/file	To include file as if '!include file' were used
    -I/path/to/*.puml	To include files with pattern
    -charset xxx	To use a specific charset (default is UTF-8)
    -e[x]clude pattern	To exclude files that match the provided pattern
    -metadata		To retrieve PlantUML sources from PNG images
    -nometadata		To NOT export metadata in PNG/SVG generated files
    -checkmetadata		Skip PNG files that don't need to be regenerated
    -version		To display information about PlantUML and Java versions
    -checkversion	To check if a newer version is available for download
    -v[erbose]		To have log information
    -quiet		To NOT print error message into the console
    -debugsvek		To generate intermediate svek files
    -h[elp]		To display this help message
    -testdot		To test the installation of graphviz
    -graphvizdot "exe"	To specify dot executable
    -p[ipe]		To use stdin for PlantUML source and stdout for PNG/SVG/EPS generation
    -encodesprite 4|8|16[z] "file"	To encode a sprite at gray level (z for compression) from an image
    -computeurl|-encodeurl	To compute the encoded URL of a PlantUML source file
    -decodeurl		To retrieve the PlantUML source from an encoded URL
    -syntax		To report any syntax error from standard input without generating images
    -language		To print the list of PlantUML keywords
    -checkonly		To check the syntax of files without generating images
    -failfast		To stop processing as soon as a syntax error in diagram occurs
    -failfast2		To do a first syntax check before processing files, to fail even faster
    -pattern		To print the list of Regular Expression used by PlantUML
    -duration		To print the duration of complete diagrams processing
    -nbthread N		To use (N) threads for processing
    -nbthread auto	To use 4 threads for processing
    -timeout N		Processing timeout in (N) seconds. Defaults to 15 minutes (900 seconds).
    -author[s]		To print information about PlantUML authors
    -overwrite		To allow to overwrite read only files
    -printfonts		To print fonts available on your system
    -enablestats	To enable statistics computation
    -disablestats	To disable statistics computation (default)
    -htmlstats		To output general statistics in file plantuml-stats.html
    -xmlstats		To output general statistics in file plantuml-stats.xml
    -realtimestats	To generate statistics on the fly rather than at the end
    -loopstats		To continuously print statistics about usage
    -splash		To display a splash screen with some progress bar
    -progress		To display a textual progress bar in console
    -pipeimageindex N	To generate the Nth image with pipe option
    -stdlib		To print standard library info
    -extractstdlib	To extract PlantUML Standard Library into stdlib folder
    -filename "example.puml"	To override %filename% variable
    -preproc		To output preprocessor text of diagrams
    -cypher		To cypher texts of diagrams so that you can share them

If needed, you can setup the environment variable GRAPHVIZ_DOT.

5.把刚才写的uml文件输出为png或其他格式 plantuml -tpng test.uml 图片如下:

输出一个文本的图plantuml -tutxt test.uml

                              ┌──────┐             ┌──────┐                                    
                              │client│             │server│                                    
                              └──┬───┘             └──┬───┘                                    
           ╔════════════════════╗│     syn=1 seq=x    │                                        
           ║客户端发送syn报文, ░║│ ───────────────────>                                        
           ║发送序列号为x       ║│                    │                                        
           ╚════════════════════╝│                    │                                        
                                 │ syn=1 ack=x+1 seq=y│  ╔════════════════════════════════════╗
                                 │ <───────────────────  ║服务端接受请求, 回复syn+ack报文, ░║
                                 │                    │  ║并置发送序列号为y,确认序列号为x+1   ║
                                 │                    │  ╚════════════════════════════════════╝ ╔═════════════════════════════════════╗│    ack=y+1 seq=z   │                                         ║客户端发送ack报文,并置发送序列号为z ░║│ ───────────────────>                                         ║确认序列号为y+1                      ║│                    │                                         ╚═════════════════════════════════════╝┴───┐             ┌──┴───┐                                    
                              │client│             │server│                                    
                              └──────┘             └──────┘                                    
Ex command in Vim(part 1)

一些小技巧(连续多行执行命令)

```
:7,$d    "从第7行开始,一直删除到最后, $代表最后一行
:.,.+3d  "删除当前行,以及之后的三行, 总共会删除4行 .代表当前光标所在行,.+3 就是当前行往下偏移3行
:.,.-4d  "删除当前行,以及之前的四行, .-4 就是当前行往上偏移4行
:.,.+3 co .-8 "把当前行和下面的3行,复制到当行往上数8行的地方 ,co是copy的简写,也可以简写为t
:/<html>/,/<\/html>/s/diy/div  "用模式指定范围,`:{start},{end}` {start}地址是模式/<html>/,而{end}地址的模式是/</\html>/;把html标签之内的diy改为div
:%s/aa/bb/g "把文档中所有的aa替换为bb,%为整个文档,相当于1,$
:.,+3 t 'a   "复制到标记a所在的行; 添加标记,normal模式下m+{字母},比如mm ma,在当前行标记m或a
```

命令行窗口

在命令行窗口中,可以用vim的方法移动光标,编辑历史命令。历史命令的数量可以通过`set history = 2000` 去记录
即使退出vim,再次打开,这些历史记录依旧存在
在命令行窗口中按下回车键`<CR>`,就会把当前行的内容的当作Ex命令进行执行(执行的对象是指调出命令窗口前的、处于活动的窗口)。

- 打开命令行窗口
    normal模式下,
        输入`q:`就可以打开一个Ex命令历史的命令行窗口
        输入`q/`就可以打开一个查找命令历史的命令行窗口
    当在编写Ex命令时,需要更强大的编辑能力,使用`<Ctrl+f>`可以切换到命令行窗口中,而且

- 退出命令行窗口
`:q` 或者`<CR>`
Wake up at 4:00

半夜醒来,果果和她都在熟睡中。喝完水,看了一下手机,三点半,躺了一下,头脑越发清醒。想到了以前学过的一片散文:《花未眠》,里面的内容都忘了,就大概记得一句:“凌晨四点,花未眠”。

搬了新家的好处就是,在这种情况下,可以起床去客厅,不用担心会打扰到家人。打开电脑,我并没有去google花未眠,突然想到了qutebrowser这个浏览器,于是安装了它。应该是一个蛮有意思的工具。确实有这样的人,找不到令自己满意的工具,他就自己造一个。妹子说他们公司的接口相应时间是分钟级别,遇到这样糟糕的系统,你能抓狂, 你也能想办法去改变它。她属于后者。因为果果的需要,她的生活被安排得非常满,工作日的中午也会回家。仔细一算,她才上了一个星期的班。下午,她发微信说鞋子磨脚。昨晚给她剪了脚指甲,看着脚上的泡,蛮心疼的。反复强调,明天穿拖鞋上班。

母亲出院了,诊断结果还好。心里的石头算是落下了。钱是可以买来健康的。到了我这个阶段,越发感受到钱的美丽。所以,有能力挣钱,有时间培家人花钱,是一件幸福的事情。劳动大概可以分为知识密集型和体力密集型。应该努力用第一种方式挣钱,用第二种方式生活。我有惰性,它让诸多会有成效的计划夭折。肚子上的赘肉,是铁证,不,应该是肉证。和妹子探讨过搬家之后的生活,我们要以知识建设为中心,而不是阶级斗争。好在互联网行业资源多,只要你愿意,总能找到门道。我最近开始看书了,打算买一写数学相关的书来看看;打算把自己的想法落地成工具,方便自己和同事。有时候,和妹子走在路上,她问,你在想什么,怎么不和我说话?居然和我没话说!!我….可能在思考数学问题吧,可能是素数的分布,也可能是晚上吃什么,要不要买块笔记本的电池。。

小皮的宝宝住院了,希望宝宝早日康复,希望小皮一切都好。

大概一个小时,就挤出这点东西。纯属流水帐,脚踩西瓜皮。文章会再次逐渐更新,尽量做到日更,不愿浪费这个客厅。

最后附上 一段《花未眠》

我常常不可思议地思考一些微不足道的问题。昨日一来到热海的旅馆,旅馆的人拿来了与壁龛里的花不同的海棠花。我太劳顿,早早就入睡了。凌晨4点醒来,发现海棠花未眠。
发现花未眠,我大吃一惊。有葫芦花和夜来香,也有牵牛花和百合花,这些花差不多都是昼夜绽放的。花在夜间是不眠的。这是众所周知的事。可我仿佛才明白过来。凌晨4点凝视海棠花,更觉得它美极了。它盛放,含有一种哀伤的美。
花未眠这众所周知的事,忽然成了新发现花的机缘。自然的美是无限的。人感受到的美却是有限的。正因为人感受美的能力是有限的,所以说人感受到的美是有限的,自然的美是无限的。至少人的一生中感受到的美是有限的,是很有限的。这是我的实际感受,也是我的感叹。人感受美的能力,既不是与时代同步前进,也不是伴随年龄而增长。凌晨四点的海棠花,应该说也是难能可贵的。如果说,一朵花很美,那么我有时就会不由自主地自语道: 要活下去!

新人报到

个人简介

  • 业余爱好: 遛娃,跑步,羽毛球,游泳
  • 身份标签: 奶爸,IT从业者,毕业大学生,退役军人
  • 座右铭:学无止境

Vim之抛砖引玉

两句玩笑

世界上有三种编辑器:Vim,Emacs和其他。 Vim是编辑器之神,Emacs是神之编辑器。

一个重点

不要使用方向键,不要使用方向键,不要使用方向键

vim使用场景

  1. ssh登陆服务器,查看文件
  2. coding?
  3. 数据处理

常用的三种模式: normal // insert // visual 模式间的切换

移动光标(hjkl)
w 往后移动一个单词 b 往前移动一个单词 gg 到第一行 G 到最后一行 gj/gk 屏幕行的移动 ctrl+u 光标向上移动半个屏幕 ctrl+d 光标向下移动半个屏幕 I 光标移动到行首,并进入插入模式 A 光标移动到行尾,并进入插入模式 ^(shift+6) 移动到行首非空字符处 0 光标移动到行首 $ 光标移动到行尾 :num 跳转到指定行,比如:12 就是跳转到12行

屏幕滚动
zz 把光标所在行设置在屏幕中间 zt 把光标所在行定位到屏幕顶部 zb 把光标所在行定位到屏幕底部

括号匹配
把光标放在括号上,然后按下%,就跳到闭合的括号上

输入补全

  1. 补全单词 ctrl+x ctrl+n/ctrl+p
  2. 补全路径 ctrl+x ctrl+f

查找字符

  1. 单行查找
    f 字符 向后查找某字符,;可以重复该查找 F 字符 向前查找某字符,;可以重复该查找
  2. 全文查找 /search_string 从光标所在位置,往下查找,N/n跳转 ?search_string 从光标所在位置,往上查找,N/n跳转 *查找 把光标移动到某个单词上,然后按下*,就可以查到所有的单词 :noh 关闭高亮

位置标记(即使关闭了文件,再打开,位置信息也存在)

`` 当前文件上次跳转的地方 `. 上次修改的地方; 比比如第二天,你再打开文件。 `^ 上次插入的地方; 比如开了个会或者和同事沟通了一些事情之后

编辑后,发现需要root权限
:w ! sudo tee %

做计算
insert模式,ctrl+r =3600247

查看字符ascii码,16进制,8进制
normal模式,ga 查看光标下的字符的ascii码

一些配置

set nocompatible
set nu
set relativenumber
syntax on
set tabstop=4
set shiftwidth=4 "自动对齐空格数
set softtabstop=4 "退格键一次可以删除4个空格
set autoindent
filetype indent on

iabbrev adn and
iabbrev ture true

" 去掉高亮
nnoremap ,, :noh<cr>

一个问题
vim会上瘾……

一些图片