ARTS 打卡 第 5 周

用户头像
引花眠
关注
发布于: 2020 年 06 月 28 日

ARTS简介

Algorithm 是一道算法题,Review 是读一篇英文文章,Technique/Tips 是分享一个小技术,Share 是分享一个观点。

Algorithm

力扣(LeetCode)15. 三数之和

你一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?请你找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

示例:

给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:

[

[-1, 0, 1],

[-1, -1, 2]

]

解题思路:

  1. 我的第一想法是把所有三个数字相加判断结果是否为0(时间复杂度为O(n^3))然后对该三个数字进行排序去重,编写好代码之后,在最后几个测试案例的时候超时了,证明这条路不通,只能想其它的方式。

  2. 因为数组中可能有重复的元素,在结果全部找到后再去重可能耗时有点长,所以如果能够在找到结果之前就去重,那应该能节省不少时间,所以可以先对输入的数组进行排序,这样方便后续的操作。

  3. 题目的要求是找出三个元素,那么我们可以先确定一个元素,然后再寻找另外的两个元素,因为我们已经将数组按照从小到大进行了排序,那么我们可以从最小的元素(a=nums[0])开始,寻找另外的两个元素,用一个指针l指向a的后一个元素,另一个指针r指向数组的最后一个元素:

  4. 因为可能有重复的值,所以需要在不同的阶段跳过重复的值

  5. 还需要对边界条件作判断(好几次都忘了),比如nums==null或nums.length<3

public class ThreeSums {
/**
* 双指针
* @param nums
* @return
*/
public static List<List<Integer>> threeSumsToZero(int[] nums) {
List<List<Integer>> ans = new LinkedList<>();
int len = nums.length;
if (nums == null || len < 3) {
return ans;
}
Arrays.sort(nums); // 排序
for (int i = 0; i < len; i++) {
int c = nums[i];
if (c > 0) {
break;
}
if (i > 0 && c == nums[i - 1]) {
continue;
}
int l = i + 1;
int r = len - 1;
while (l < r) {
int z = c + nums[l] + nums[r];
if (z == 0) {
ans.add(Arrays.asList(c, nums[l], nums[r]));
while (l < r && nums[l] == nums[l + 1]) {
l++; // 去重
}
while (l < r && nums[r] == nums[r - 1]) {
r--; // 去重
}
l++;
r--;
} else if (z < 0) {
l++;
} else if (z > 0) {
r--;
}
}
}
return ans;
}
}

Review

学习-微服务架构模式系列,网站地址是:https://microservices.io

微服务架构-Pattern: Self-contained service

这篇文章的主要介绍了分解模式:自包含服务。

一个在线外卖网站:FTGO,其使用的是微服务架构,客户端通过提交Post请求创建订单,期望在600ms获得响应。创建订单的责任分布在不同的服务中,请求路由到Order Service,Order Service 负责与其他服务协作:

  • Restaurant Service 知道饭店的菜单和价格

  • Consumer Service 知道下单的消费者的状态

  • Kitchen Service 创建一个Ticket,告诉厨师做什么

  • Accounting Service 授权消费者的信用卡

在处理同步请求时,服务应如何与其他服务协作?

强制条件:

  1. 微服务体系结构通常将处理请求的责任分配到多个服务之间

  2. 操作通常需要低延时高可用

  3. 操作的可用性是处理请求时调用的所有服务的可用性

  4. 服务可以重试对失败的协作者的请求,但这会增加响应时间。

解决方式:设计一个可以即时响应同步请求的服务,自包含服务

  1. 方式一 将所需的功能实现为服务模块,而不是单独的服务。

  2. 方式二 使用 CQRS 和 Saga 模式与其他服务协作。使用 Saga 模式异步保持数据一致性,使用 CQRS 模式维护其他服务拥有的数据的副本

结论:

  1. 好处:改进可用性和响应时间

  2. 不足:

Tips

记录我对于Linux的学习,从磁盘相关的命令开始:

ps:”~” 表示为 home 目录,”.” 则是表示目前所在的目录,”..” 则表示当前目录的上一层目录

-h 用人类可读的格式展示(G(千兆字节),M(兆字节),K(千字节)),大部分命令有这个参数

du用于显示指定的目录或文件所占用的磁盘空间。

常用参数:

  • -a或-all 显示目录中个别文件的大小。

  • -b或-bytes 显示目录或文件大小时,以byte为单位。

  • -c或–total 除了显示个别目录或文件的大小外,同时也显示所有目录或文件的总和。

  • -D或–dereference-args 显示指定符号连接的源文件大小。

  • -h或–human-readable 以K,M,G为单位,提高信息的可读性。

  • -H或–si 与-h参数相同,但是K,M,G是以1000为换算单位。

  • -k或–kilobytes 以1024 bytes为单位。

  • -s或–summarize 仅显示总计。

  • –exclude=<目录或文件> 略过指定的目录或文件。

  • –max-depth=<目录层数> 超过指定层数的目录后,予以忽略。

du -h
16K ./build/redhat
24K ./build/android/bochs
32K ./build/android
1.3M ./build/macos
12K ./build/linux
392K ./build/win32/nsis
552K ./build/win32
404K ./build/macosx
2.3M ./build
...
91M .
## 显示所有目录或文件的总和
du -hc
16K ./build/redhat
24K ./build/android/bochs
32K ./build/android
1.3M ./build/macos
12K ./build/linux
392K ./build/win32/nsis
552K ./build/win32
404K ./build/macosx
2.3M ./build
...
91M .
91M 总用量
## 如果我们只想知道所有目录或文件的总和,使用如下命令
du -hs
91M .

Share

分享最近对计算机基础的复习,这次分享的是信息的表示与存储 - 浮点数的运算,可能会有不足之处,之后会根据理解继续修改。



发布于: 2020 年 06 月 28 日 阅读数: 36
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
ARTS打卡 第5周