ARTS 第 7 周

每周一道算法、点评一篇英文技术文章、学习一个技术技巧、分享一个技术观点和思路

Algorithm

Problem: Reverse Integer

思路 1

当成字符串处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Solution {
public int reverse(int x) {
int flag = x > 0 ? 1 : -1;
Long abs = Math.abs(((long) (x)));
String s = String.valueOf(abs);
char[] chars = s.toCharArray();
for (int i = 0; i < s.length() / 2; i++) {
char temp = chars[i];
chars[i] = chars[s.length() - 1 - i];
chars[s.length() - 1 - i] = temp;
}

if (Long.parseLong(String.valueOf(chars)) > Integer.MAX_VALUE) {
return 0;
}
return Integer.parseInt(String.valueOf(chars)) * flag;
}
}

很挫的思路。。。

思路 2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution {
public int reverse(int x) {
long rev = 0;

while(x != 0){
rev = rev * 10 + x % 10;
x /= 10;

if(rev > Integer.MAX_VALUE || rev < Integer.MIN_VALUE)
return 0;
}

return (int)rev;
}
}

Review

关于 CAP 定理的文章 System Design Interview Concepts – CAP Theorem

  • 一致性(Consistency):查询时,每个节点将返回最新数据。如果没有,系统就会出错。写请求可通过先同步再返回来实现。
  • 可用性(Availability):在任何时候,系统触发的每个请求都会生成有效的响应。可通过复制数据来实现。
  • 分区容错性(Partition Tolerance):即使发生网络故障或数据丢失,系统也能够连续执行。可通过复制节点来实现。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性、可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

CA 系统

关注一致性和可用性。所有节点之间的数据都是一致的,您可以从任何节点读取/写入,但是 CA 系统不能容忍网络错误或节点错误,一旦出现这样的问题,整个系统就会拒绝写请求,因为它不知道对面的那个节点是否挂掉了,还是只是网络问题,唯一安全的做法就是把自己变成只读。

CP 系统

关注一致性和分区容错性。这样的系统只需要保证大多数节点数据一致,而少数的节点会在没有同步到最新版本的数据时变成不可用的状态。这样能够提供一部分的可用性。

AP 系统

关注可用性和分区容错性,节点总是在线,但它们可能无法获取最新数据,但是,只要线路正常,它们就会同步。

下面是一些数据存储的分类:

  • CA
    • RDBMS( MySQL, MSSQL Server)
  • CP
    • Google BigTable
    • Hbase
    • MongoDB
    • MemcacheDB
    • Redis
  • AP
    • Dynamo DB
    • Voldemort
    • Cassandra
    • SimpleDB
    • CouchDB
    • Riak

设计分布式系统时,我们应该根据系统的需求进行取舍。如果我们需要更高的一致性,则需要可用性或者分区容错性要求不高,如果可以牺牲一些一致性或分区容错性,则可以调整可用性。

部分内容来源于:左耳听风专栏

Tip

使用 Python 快速搭建一个简单 HTTP 服务。

在指定的目录下,然后执行

Python2.x

1
python -m SimpleHTTPServer 8080

Python3.x

1
python -m http.server 8080

Share

最近在写文档,发现 Word 各种玩不转,然后选择了 Markdown。仔细想想除了 Word 还有 Excel 和 PPT 都玩不转。。。

其实程序员不仅仅只是输出代码,应该还有各种文档。编写文档、制作PPT、画各种图,这些都可以称为“软技能”。所以平时除了学习编码技术外,提高软技能也是挺重要的。一技之长,多方位提升。

(完)