重开博客

Featured

博客断断续续,不知道重开多少次了。

以前申学校,找工作的时候,无比焦虑,忙起来连饭都不想吃,也顾不上更新。

现在工作渐渐稳定下来,似乎进入了一段“和平”时期,于是打算收拾一下之前的烂摊子。

这次换了主机,换了主题,换了很多插件,连博客名也换了。改的连妈都不认识了。

删了很多比较水的文章和评论,尽量保证公开发布的文章都是原创。

现在大部分文章都是LeetCode题解,也算是找工作时期的一段回忆吧。水平有限,不一定是最优解,而且好多解法现在都忘了,不过也欢迎探讨。

解决Google Compute Engine不能发送邮件的问题

1. 动机

昨天打算直接对WordPress数据库进行一些操作,为了防止玩脱先进行备份。当我用小插件把数据库备份发送到邮箱时,赫然出现了一行提示:

wordpress无法发送邮件,可能原因:您的主机禁用了 mail() 函数

你妹啊(╯‵□′)╯︵┻━┻

之前就是因为发不了邮件的问题,把博客搬到了GCE上的(见《在Google Compute Engine上安装WordPress》)。现在还是发不了,有种被坑了的感觉啊(ಥ_ಥ)

为什么会这样呢?明明是我自己的服务器…

Continue reading 解决Google Compute Engine不能发送邮件的问题

在Google Compute Engine上安装WordPress

1. 动机

之前一直在用某香港虚拟主机,某天突然发现数据库定时备份发送到邮件的功能坏掉了(提示邮件发送成功,然而就是收不到邮件),八成是空间商禁用了什么端口或者修改了security policy。回想起以前也出现过各种问题,一会禁用mail()了,一会禁用fsockopen()了,一会又禁用openssl了,深深地感到寄人篱下的诸多不便。虽然很多问题联系客服也能解决,不过还是喜欢一切尽在掌控中的感觉啊。自己搭服务器,爱怎么设置就怎么设置,哼(╯‵□′)╯︵┻━┻

于是打算使用Google Compute Engine(以下简称GCE)。一方面原因,之前用过AWS EC2,这次想体验一下新平台,顺便比较一下同为IaaS的GCE和AWS EC2到底有何差距。另一方面就是作为狗家脑残粉的个人癖好了。

至于为什么不用Google App Engine(以下简称GAE),GAE作为PaaS限制颇多,违背了初衷。一个最大的缺点是没有写入文件的权限,导致安装主题、插件等都要先在本地装好再部署上去[1]。如此麻烦还不如一般的虚拟主机。

由于网上关于在GCE安装Wordpress完整流程的文章不多,所以为了让没有任何背景知识的人也能成功安装,以下内容会比较啰嗦,请谅解_(:зゝ∠)_

Continue reading 在Google Compute Engine上安装WordPress

简单暴力翻墙法:搭建自己的VPN

网上各种免费、收费VPN良莠不齐,时好时坏。如果VPN在你最需要的时候掉链子,着实令人沮丧。为什么不自己搭建一个呢?

关键点在于要有一个不被墙的境外服务器,确保你和该服务器正常通信,该服务器和你想访问的网站或服务可以正常通信。这里以AWS EC2为例。

Continue reading 简单暴力翻墙法:搭建自己的VPN

LeetCode #33 Search in Rotated Sorted Array

题目:

Suppose a sorted array is rotated at some pivot unknown to you beforehand.
(i.e., 0 1 2 4 5 6 7 might become 4 5 6 7 0 1 2).
You are given a target value to search. If found in the array return its index, otherwise return -1.
You may assume no duplicate exists in the array.

 

分析:

在一个旋转过的有序数组中查找一个数,如果该数不存在,返回-1。

方法一:

首先通过二分查找找出数组中最小值的位置。这样我们可以将数组分成2段,使得每一段都是有序的。之后看要查找的数(target)的值落在哪一段,然后再在这一段里进行一次二分查找即可。

方法二:(推荐)

对于每一轮二分查找,中点的左侧和右侧必然有有一边是有序的。我们看看target是不是在有序的这个范围内,是的话就查这一边,不是的话就查另一边。

Continue reading LeetCode #33 Search in Rotated Sorted Array

已知前序遍历、中序遍历、后序遍历结果其中之二,生成二叉树

一、已知前序遍历和中序遍历

假设我们用2个数组preorder和inorder来表示前序和中序遍历的结果。

要生成的二叉树的任意子树都对应于preorder和inorder的某个子数组。该子树的根节点对应于preorder子数组的第一个元素,然后在inorder中查找该该元素。对于inorder中的的子数组,根节点元素左侧的子数组对应左子树,右侧的子数组对应右子树。之后使用递归重复该过程。

下面给出一段Java示例代码:

Continue reading 已知前序遍历、中序遍历、后序遍历结果其中之二,生成二叉树

LeetCode #133 Clone Graph (拷贝图)

题目:

Clone an undirected graph. Each node in the graph contains a label and a list of its neighbors

 

分析:

拷贝一个图。每个节点中用List存储它的邻居节点。

基本思路就是遍历原图,使用一个map来记录已经访问过的节点以及它和新节点的对应关系。

遍历可以考虑DFS或者BFS。下面的代码是使用BSF实现的。

Continue reading LeetCode #133 Clone Graph (拷贝图)

LeetCode #148 Sort List (链表合并排序)

题目:

Sort a linked list in O(n log n) time using constant space complexity.

 

分析:

排序一个链表。要求O(nlogn)时间,O(1)空间。

说到O(nlogn)时间,首先想到的是合并排序。虽然合并排序对于数组是O(n)空间,但是对于链表却可以做到O(1)空间。

Continue reading LeetCode #148 Sort List (链表合并排序)

LeetCode #71 Simplify Path (路径化简)

题目:

Given an absolute path for a file (Unix-style), simplify it.
For example,
path = "/home/", => "/home"
path = "/a/./b/../../c/", => "/c"

 

分析:

路径化简。

基本思路就是使用栈来模拟进入某一路径或者返回上一级。

注意以下边界情况:

  • "/../" 应化简为 "/"
  • "/home//foo/" 应化简为 "/home/foo"

Continue reading LeetCode #71 Simplify Path (路径化简)