字典序算法

给定一个排列,如 "aazz" ,求按照字典排列方式的下一个字符,这里是:"azaz".

以 "aazz" 为例,字典序的算法步骤如下:

  • 从右至左遍历,找出第一个左邻小于右邻的字符,记下位置 left;

本例中为 'a', left = 1;

  • 再次从右至左遍历,找出第一个比 str[left] 大的字符,记下位置为 right;

本例中为 'z', right = 3;

  • 交换 str[left] 和 str[right]

本例变成:'azaz';

  • 将 left 以后的字符按照从小到大排列。

  • 重复上述过程

结束条件: 如果第一步中,找不到左邻小于右邻的字符,则说明已经是字典序的最后一个排列了。

位图法

本文总结下位图法在数据去重方面的使用,全文分为三个部分:

  • 一是位图法的定义

  • 二是使用位图法判断数据是否存在

  • 三是使用位图法找出不重复的数据

最后,附上C++的实现。

(更多…)

杂七杂八算法

一些杂七杂八的小算法,长期不用挺容易忘的,顺手记录一下。

本文主要记录四种算法:

  • 最小公倍数

  • 最大公约数

  • 开平方根

  • 进制转换

(更多…)

搭建ngrok内网穿透

  目前,公网 IP 地址数量稀少,我们的个人电脑大都在重重内网内部,端口号通过 NAT 层层映射,导致无法向公网提供一个稳定的访问入口。若想让公网提供服务(比如搭建一个的Web服务器)我们一般选择购买云服务器,但是性能强大的云服务器价格很高,因此我们应该找一个办法让内网的电脑能向公网暴露一个 稳定的 访问入口。

  ngrok 就能用来解决这个问题。

(更多…)

计算机数值编码和运算

  计算机的数值编码和运算应该是本科一年级就会学习的基础知识。从软件开发这个角度来说,很多时候这些知识没有在开发过程中得到有效的利用和实践。
  不巧,最近在做的一个项目,常常需要从补码的角度考虑数值表示和相关关系。因此,也就趁此机会简单的写一写。

(更多…)