2018LeeCode算法题解一之Valid Palindrome

原题Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.For example"A man, a plan, a canal: Panama" is a palindrome."race a car" is not a palindrome.NoteHave you consider that the string might be empty? This is a good question to ask during an interview.For the purpose of this problem, we define empty string as valid palindrome.原题链接:https://...阅读全文

【开发中】基于树莓派的智能家居项目的设想与实现 Hestia

注:本文内容的准确性仅限于笔者写该篇文章时的情况,不保证后续与实际项目代码一致。实时内容还请关注Github项目托管页面:https://github.com/GenialX/hestia-serve树莓派,一个五脏俱全,集几乎所有功能于一身的微型计算器。大约一两月之前,屈屈300百大洋收入囊中。入手之后,出于对自动化的兴趣,慢慢地研究如何实现室内家电的智能自动化控制。在断断续续地,不断地摸索之后,有了若干想实现的点子,迄今为止也有所实践。点子利用红外线传感器智能控制空调、电视等基于红外遥控的家电设备;智能控制家中的灯泡设备(部分基于网络协议);(待更新...方案硬件首先,除了树莓派之外,还需要如下硬件移动端设备 iPhone一台(安卓手机当然也没问题,但是本案例中只基于iPhone做了实现外网可直接访问的服务器一台(本案例使用阿里云服务器基于树莓派的传感器若干基于光敏电阻的光线传感器一个...阅读全文

内网穿透工具的原理与开发实战

在我国,由于网民众多,运营商无法保证为每一个宽带用户提供全球唯一的公网IPv4地址。因此很多用户会发现通过路由器端查看到的WAN端IP与百度“IP”关键词所得到的IP不一致,并且前者的IP为一个私有IP。而还有一些情况下,公网IP比较昂贵,企业虽然本身也持有少量的独立的公网IP,但是由于成本限制无法为企业内每一台主机都提供一个公网IP,或者内网并不是所有服务都需要暴露到公网中进行访问,那么企业有可能就会使用NAT技术将大量的内网IP通过一定规则映射到公网IP上。而最常见的其中一种技术就是NAPT,也叫“网络端口地址转换”。因为一般一个服务都是通过一个端口来提供,因此通过这种方式可以将特定的服务通过特定的规则开放到少量的公网IP上。阅读全文

那些年,我们追过的RPC

1974年冬,互联网大师 Jon Postel发表了RFC674:“Procedure Call Protocol Documents,Version 2”,尝试定义一种在包含70个节点的网络中共享资源的通用方法。在大师一生中编辑过的无数个RFC文档中,674属于并不突出的一个,但却拉开了RPC的序幕。也正是接下来我们故事的开始。阅读全文

从小白到机器学习算法工程师,我做了哪些准备?

一、方向选择都说选择比努力重要,这个鸡汤我觉得可以干了。起初接触人工智能领域是在硕士选择导师的时候,当时民叔推荐来到人工智能与机器人研究所,跟随现在的硕导做图像处理方面的研究,用到一些机器学习的算法做分类工作。在学校学习平台比较重要,它决定了你会见识什么人、什么样的黑科技、什么样的应用等,没有这些东西勾起你的好奇心,也就没有对未来的规划或者说期待。硕士期间,养成了看论文的习惯,专注领域顶级期刊论文,当然了首先是先把自己研究的课题相关知识看的透彻,这个在第二小节中会介绍:为什么硕士课题很重要。一些我认识是牛人的人说,看论文是在跟领域大牛在交流,这个确实刚开始体会不到,起初很排斥看论文,更加上我的英语那是一个...后来看多了,发现知识之间都是相通的,可能解决一个问题用的是同一个方法,这样看一篇论文的时间会大大缩短,有效率了,心里便更愿意去看论文。康奈尔大学图书馆网站每天更新世界上各个大牛写的论...阅读全文

ZigZag Conversion(math)

QuestioThe string "PAYPALISHIRING" is written in a zigzag pattern on a given number of rows like this: (you may want to display this pattern in a fixed font for better legibilityP A H A P L S I I Y I And then read line by line: "PAHNAPLSIIGYIR"Write the code that will take a string and make this conversion given a number of rowsstring convert(string text, int nRows);convert("PAYPAL...阅读全文

TDD(测试驱动开发)的好处

你会更加站在用户的角度去看你将要完成的产品,你要尽可能想到用户所有进行的操作。而不是从程序员的角度想用户应该会如何去使用我们的产品。测试用例是在对功能进行测试。在写代码之前先写测试用例,可以对我们编写代码提供指导性的参考。防止我们漏掉一些功能。它使我们对自己代码有了信心,因为我们事先设计好的所有测试用例都Pass了。如果在更改代码后测试用例不能通过,我们可以根据不能通过的测试用例精确的定位问题,并轻而易举的解决的这个bug。哈!我们的一整套完备的测试用例在这里替我们把关(把的什么关?),我们就可以十分安全的使用极限编程的另一个最重要的工具——重构。重构改变的是代码的内部结构,而不会改变外部接口功能。知道在做重构时测试用例是把的什么关了吧!很明显,测试用例是保证我们在进行重构时,不会影响到代码的外部接口功能。所以我刚刚说,我们进行的重构是十分安全的。基于第5点,我们找到了重构的信心,必要时候...阅读全文

编程的智慧

编程是一种创造性的工作,是一门艺术。精通任何一门艺术,都需要很多的练习和领悟,所以这里提出的“智慧”,并不是号称一天瘦十斤的减肥药,它并不能代替你自己的勤奋。然而由于软件行业喜欢标新立异,喜欢把简单的事情搞复杂,我希望这些文字能给迷惑中的人们指出一些正确的方向,让他们少走一些弯路,基本做到一分耕耘一分收获。反复推敲代码既然“天才是百分之一的灵感,百分之九十九的汗水”,那我先来谈谈这汗水的部分吧。有人问我,提高编程水平最有效的办法是什么?我想了很久,终于发现最有效的办法,其实是反反复复地修改和推敲代码。在IU的时候,由于Dan Friedman的严格教导,我们以写出冗长复杂的代码为耻。如果你代多写了几行,这老顽童就会大笑,说:“当年我解决这个问题,只写了5行代码,你回去再想想吧……” 当然,有时候他只是夸张一下,故意刺激你的,其实没有人能只用5行代码完成。然而这种提炼代码,减少冗余的习惯,却...阅读全文

Rabin-Karp 算法(字符串快速查找)

Go 语言的 strings 包(strings.go)中用到了 Rabin-Karp 算法。Rabin-Karp 算法是基于这样的思路:即把字符串看作是字符集长度进制的数,由数值的比较结果得出字符串的比较结果。朴素的字符串匹配算法为什么慢?因为它太健忘了,前一次匹配的信息其实有部分可以应用到后一次匹配中去,而朴素的字符串匹配算法只是简单的把这个信息扔掉,从头再来,因此,浪费了时间。好好的利用这些信息,自然可以提高运行速度。由于完成两个字符串的比较需要对其中包含的字符进行逐个比较,所需的时间较长,而数值比较则一次就可以完成,那么我们首先把“搜索词”中各个字符的“码点值”通过计算,得出一个数值(这个数值必须可以表示出字符的前后顺序,而且可以随时去掉某个字符的值,可以随时添加一个新字符的值),然后对“源串”中要比较的部分进行计算,也得出一个数值,对这两个数值进行比较,就能判断字符串是否匹配。对...阅读全文

Golang并发编程中的同步(sync)与通信(channel)

Golang中实现并发非常简单,只需在需要并发的函数前面添加关键字"go",但是如何处理go并发机制中不同goroutine之间的同步与通信,golang 中提供了sync包和channel机制来解决这一问题。Synsync 包提供了互斥锁这类的基本的同步原语。除 Once 和 WaitGroup 之外的类型大多用于底层库的例程。更高级的同步操作通过信道与通信进行。而golang中的同步是通过sync.WaitGroup来实现的。WaitGroup的功能:它实现了一个类似队列的结构,可以一直向队列中添加任务,当任务完成后便从队列中删除,如果队列中的任务没有完全完成,可以通过Wait()函数来出发阻塞,防止程序继续进行,直到所有的队列任务都完成为止。WaitGroup总共有三个方法:Add(delta int), Done(), Wait()。Add:添加或者减少等待goroutine的数量...阅读全文

Professor Frisby’s Mostly Adequate Guide to Functional Programming

前言同学推荐的书籍,Mark下,有时间阅读About this booThis is a book on the functional paradigm in general. We'll use the world's most popular functional programming language: JavaScript. Some may feel this is a poor choice as it's against the grain of the current culture which, at the moment, feels predominately imperative. However, I believe it is the best way to learn FP for several reasonsYou likely use it ev...阅读全文

Shell脚本之输出带颜色的字体

shell脚本中echo显示内容带颜色显示,echo显示带颜色,需要使用参数-格式如下echo -e “\033[字背景颜色;文字颜色m字符串\033[0m”例如echo -e “\033[41;36m something here \033[0m”其中41的位置代表底色, 36的位置是代表字的颜色注  1、字背景颜色和文字颜色之间是英文的”;”2、文字颜色后面有个3、字符串前后可以没有空格,如果有的话,输出也是同样有空格下面是相应的字和背景颜色,可以自己来尝试找出不同颜色搭配例echo -e “\033[31m 红色字 \033[0m”echo -e “\033[34m 黄色字 \033[0m”echo -e “\033[41;33m 红底黄字 \033[0m”echo -e “\033[41;37m 红底白字 \033[0m”字颜色:30—–3echo -e “\033[30m 黑色字 \033[0m”...阅读全文

按位运算代替乘、除和取模:哪个更快?

许多程序员都意识到这个特例,就是当你乘或除一个2次幂的时候,你可以用位移运算符来代替乘法和除法。比如:你可以用i << 1代替i*2和用i>>1代替i / 2。还有一个不太为人所知的方法是取模。但是这些方法实际上哪个更快呢?今天这篇文章就要来测试它们以下就是今天的竞争对手这就是多次执行这些操作后的性能测试我在以下环境中运行了这个测试应用程序• Flex SDK (MXMLC) 4.6.0.23201, compiling in release mode (no debugging or verbose stack traces• Release version of Flash Player 11.3.300.27• 2.3 Ghz Intel Core i• Mac OS X 10.8.下面就是我得到的结果上述结果表明按位操作方法在三分之二的测试中取胜:除法和取模。在乘法案例...阅读全文