Seven's blog

你不会找到路,除非你敢于迷路

0%

ARTS-10

Algorithm

1252. 奇数值单元格的数目

解法一

思路:

因为题目中行列式每次数据变换都是整行或者整列同时进行的, 所以只需要统计每一行和每一列会被自增多少次即可. 最后对应行和列的统计结果相加即为对应坐标的数值.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int oddCells(int n, int m, int[][] indices) {
int[] rows = new int[n];
int[] columns = new int[m];
for (int[] axis : indices) {
rows[axis[0]]++;
columns[axis[1]]++;
}

int oddNumber = 0;
for (int row : rows) {
for (int column : columns) {
if ((row + column) % 2 == 1) {
oddNumber++;
}
}
}

return oddNumber;
}
}

执行用时: 1ms, 内存消耗: 38.7MB.

解法二

思路: 统计行列累加次数的思路同解法一. 但是最后的记数可以优化.

解法一遍历了每一个坐标的数值并对其进行奇偶判断, 最后累加出奇数数量; 但是实际上我们没有必要对其进行遍历.

我们可以把行和列拆开, 分别统计最后有多少个奇数行, 有多少个奇数列, 然后使用算数求解最后的奇数数量.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution {
public int oddCells(int n, int m, int[][] indices) {
int[] rows = new int[n];
int[] columns = new int[m];
for (int[] axis : indices) {
rows[axis[0]]++;
columns[axis[1]]++;
}

int r = 0, c = 0;
for (int row : rows) {
r += row % 2;
}

for (int column : columns) {
c += column % 2;
}

return r * (m - c) + c * (n - r);
}
}

执行用时: 0ms, 内存消耗: 35.6MB.

Review

声明

水平以及精力有限,下文可能存在很多问题错译,仅做个人学习之用,如果需要学习 Docker, 还请查阅其他资料!!!

Orientation and setup

Docker 概念

Docker 是一个提供给开发人员和系统管理员拿来在容器中构建、分享、运行应用的平台。使用容器部署应用程序的过程叫作 容器化。容器不是新的发明,但是使用容器简单部署应用却是新出现的。

容器化越来越受欢迎是因为:

  • 适应性强:即便是最复杂的应用也可以被容器化。
  • 轻量级:容器利用并且共享系统内核,使它们在系统资源方面比虚拟机更高效。
  • 便携的:你可以在本地构建,云端部署,然后运行在任何地方。
  • 松耦合:容器是高度自给自足并且封装的,允许你更换或者升级其中一个而不影响其他容器。
  • 可复制的:你可以通过数据中心添加并且自动分发容器的复制品。
  • 安全:容器积极地将限制和隔离应用与流程而无需用户的任何配置。

镜像和容器

从本质上来讲,容积就只是一个运行的程序,只是增加了一些封装的功能,使容器与主机和其他容器隔离。容器隔离最重要的一个方面是每一个容器都只与自己的私有文件系统进行交互,这个文件系统是由 Docker 镜像提供的。一个镜像包含了运行容器所需的所有东西:代码、二进制文件、运行时、依赖或者是需要的任何其他文件系统对象。

容器和虚拟机

容器运行在 Linux 本地并且和其他容器共享系统内核。它运行了一个独立的进程,并不会比其他可执行应用占用更多的内存,这个特性使得容器更加轻量级。

截然不同的是,虚拟机运行了了一个完整的操作系统,并且通过虚拟机管理程序对主机资源进行虚拟访问。通常,虚拟机会产生大量的超出了应用程序逻辑所消耗的开销。

容器虚拟机对比图

编排

容器化程序的可以执行和可重复性意味着我们有着可以跨云和数据中心来移动或者扩展应用程序的优势;容器有效地保证了这些应用程序在任何地方都会以相同的方式运行,使我们能够简单快速地利用所有环境。此外,随着应用程序的扩展,我们需要一些工具帮助我们自动化地维护这些应用,能够自动替换发生故障的容器,并且能够在应用的生命周期内对其进行管理和重新配置。

用来管理、扩展和维护容器化应用的工具称为编排器,最具代表性的是 KubernetesDocker Swarm 。 Docker Desktop 提供了这两个工具的开发环境部署,我们将在本指南中使用它来创建我们的第一个编排的、容器化的程序。

安装 Docker 桌面版

因为文档描述的安装流程只有 Windows 和 OSX,与我无关,不再转译。感兴趣的话请自行阅读 原文

Tip

记录一下 Mysql 中的两种日志:

binlog

  1. Server 层, 所有引擎都可以使用;
  2. binlog 是逻辑日志, 记录的是 SQL 语句的原始逻辑;
  3. binlog 可以追加写入, 做到不覆盖以前的日志;

redo log

  1. InnoDB 特有日志;
  2. redo log 是物理日志, 记录的是 “在某个数据页上做了什么修改”;
  3. redo log 是循环写入, 空间会耗尽;

两阶段提交

binlog 和 redo log 使用 “两阶段提交” 保证一致性, 一条更新语句由执行器传递给 InnoDB 存储引擎 -> InnDB 执行成功后 -> InnoDB 记录 redo log 并且把当前语句的执行状态标记为 prepare, 然后告知执行器可以提交事务 -> 执行器记录 binlog 并提交事务 -> InnoDB 把刚才写入的 redo log 改成 commit 状态, 更新完成.

Share

本周极客时间推出了年终学习总结, 虽然不太准, 但仍有参考意义.

我的总结内容是学习 31 小时, 超过 96% 的用户. 看到有位朋友分享出来的截图, 学习 2 小时, 超越 85% 的用户. 要知道, 极客时间是一款学习产品, 来到这里的人已经是有着极强学习意愿的人.

你看, 即便是在当前的大环境下, 即便是有着极强的学习意愿, 持续学习的人依旧是少数.

所以, 大可不必焦虑. 把焦虑的时间拿来学习, 然后努力成为前 10%, 或者加把劲儿成为前 5%. 生活自会越来越好.

想变得更优秀, 其实很简单. 找准自己的方向, 持续学习就完了.


当然, 此处数据略有偏颇.

毕竟极客时间现在还算是小众, 有着更多的人在使用其他的产品和方法在学习;

毕竟极客时间一直在策划各种活动, 主动或者被动引来了一大批僵尸用户.

虽是管中窥豹, 仍旧可见一斑.

微信公众号
扫码关注, 一起进步!