写点什么

ARTS 打卡 第 31 周

用户头像
引花眠
关注
发布于: 2021 年 02 月 16 日

ARTS 简介

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


Algorithm

力扣(LeetCode)-52. N皇后 II


n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。


输入:n = 4输出:2解释:4 皇后问题存在两个不同的解法。
复制代码


解题思路:典型的 dfs 问题


  1. 一层一层的遍历判断

  2. 在每一个可能的点判断列、左斜方、右斜方是否存在攻击,每一个方向用一个集合存储列 存放已经放置皇后的位置左斜方 放置行与列之间的关系,用坐标画一条直线,可以看出 col = row + c,c 表示某一个固定的值右斜方 同样放置行与列之间的关系,用坐标画一条直线,可以看出 col = d - row,d 表示某一个固定的值

  3. 最后统计所有满足条件的值


class Solution {
private int count; private int n; private Set<Integer> cols; private Set<Integer> pies; private Set<Integer> nas;
public int totalNQueens(int n) { if (n < 1) { return 0; } this.n = n; cols = new HashSet<>(); pies = new HashSet<>(); nas = new HashSet<>(); dfs(0); return count; }
public void dfs(int row) { if (row >= n) { count++; return; } for (int j = 0; j < n; j++) { if (checkValidState(row, j)) { cols.add(j); pies.add(j - row); nas.add(j + row); dfs(row + 1); cols.remove(j); pies.remove(j - row); nas.remove(j + row); } } }
private boolean checkValidState(int row, int col) { if (cols.contains(col)) { return false; } int pie = col - row; if (pies.contains(pie)) { return false; } int na = col + row; if (nas.contains(na)) { return false; } return true; }
}
复制代码


ps:参考资料


  1. 《剑指Offer:名企面试官精讲典型编程题(第2版)》

  2. labuladong 的算法小抄

  3. labuladong的算法小抄-实体书


Review

学习-微服务架构模式系列,网站地址是:https://microservices.io 微服务架构-Pattern: API Gateway / Backends for Frontends 这篇文章的主要介绍了微服务架构下的外部 API 的模式:API 网管/前端专属的后端模式 背景:使用微服务架构,有多种客户端需要访问服务接口,服务接口通过 REST 方式暴露,在此情况下如何设计服务 API


问题:各种客户端如何访问各个服务


强制条件


  1. 服务提供的 Api 粒度与客户端的需求存在差异

  2. 不同的客户端需要不同的数据

  3. 不同客户端的网络状况是不一样的

  4. 服务的实例数量和位置是动态改变的

  5. 服务分区或改变对于客户端应该是透明的

  6. 服务使用的协议可能对于 web 不是很友好


解决方法


  1. 所有的客户端访问一个统一的 API 网关,网关的两个方式简单的路有聚合多个服务

  2. 变种,后端前置 每一类客户端一个 Api Gateway


好处


  1. 将客户端与微服务的切分隔离

  2. 将客户端与服务发现隔离

  3. 提供适合的接口

  4. 降低了请求往返次数

  5. 通过将聚合服务逻辑转移到 API 网关来简化客户端

  6. 屏蔽了后台服务协议


不足


  1. 可以预见的复杂性

  2. 增加的响应时间


ps:《微服务架构设计模式》


Tips

记录我对于 Linux 的学习,网络管理的命令:


ps:“~” 表示为 home 目录,“.” 则是表示目前所在的目录,“…” 则表示当前目录的上一层目录 -h 用人类可读的格式展示(G(千兆字节),M(兆字节),K(千字节)),大部分命令有这个参数


nice 命令

nice 命令以更改过的优先序来执行程序 nice 表示的是 niceness ,其含义是友善度、谦让度。用于进程中,表示进程的优先级,也即进程的友善度。niceness 值为负时,表示高优先级,能提前执行和获得更多的资源,对应低友善度;反之,则表示低优先级,高友善度。


使用方式:nice [OPTION] [COMMAND [ARG]…] 常用选项:


  1. -n djustment, -adjustment, --adjustment=adjustment 皆为将该原有优先序的增加 adjustment

  2. –help 帮助

  3. –version 版本


 ~ nice0
复制代码


ps:当 nice 没有选项时,输出值表示系统进程缺省的 niceness 值,一般为 0。


 ~ nice vi& #当nice命令中没有给出具体的niceness值时,默认为10 308445 ~ vi& #对比 308691
➜ ~ ps -lF S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD0 S 1000 305374 305360 0 80 0 - 3099 - pts/0 00:00:01 zsh0 T 1000 308445 305374 0 95 15 - 1584 - pts/0 00:00:00 vi0 T 1000 308691 305374 0 85 5 - 10730 - pts/0 00:00:00 vim4 R 1000 308736 305374 0 80 0 - 2505 - pts/0 00:00:00 ps
复制代码


ps:在 ps 的进程信息中 NI 表示的就是 nice 值,我们可以看到 nice vi& 与 vi&的 nice 值相差 10


Share

最近在极客时间报名了训练营,时间有点不充分,后期会补上的。最近的学习面向对象设计原则


发布于: 2021 年 02 月 16 日阅读数: 10
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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