ARTS 打卡 第 8 周

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

ARTS简介

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

Algorithm k个一组翻转链表

力扣(LeetCode)25. K 个一组翻转链表

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例:

给你这个链表:1->2->3->4->5

当 k = 2 时,应当返回: 2->1->4->3->5

当 k = 3 时,应当返回: 3->2->1->4->5

说明:

你的算法只能使用常数的额外空间。

你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

解题思路:

这到题与上一题有些相似,但有不同,上一题是本题的特例,就是k=2,所以解题思路可以参考,但是么词查找需要转换的节点的前一个节点有点费时,换一种思路

  1. 把链表分为k个元素一组的子链表,然后将这个子链表反转,然后再反转下一个子链表

  2. 需要注意的是,在翻转子链表时,要注意需要保存首节点与首节点的前一个节点,否则翻转之后不能链接

/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseKGroup(ListNode head, int k) {
if (head == null || k == 1) {
return head;
}
ListNode ans = new ListNode(0);
ans.next = head;
ListNode pre = ans;//pre指向head的前一个节点
ListNode kthN = head;
int count = 0;
while (kthN != null) {
count++;
if (count % k == 0) {
pre = reverse(pre, kthN.next);
kthN = pre.next;
} else {
kthN = kthN.next;
}
}
return ans.next;
}
/**
*
* @param pre
* k个节点的子链表的首节点的前一个节点
* @param kthNodeNext
* k个节点的子链表的尾节点的下一个节点
* @return
*/
private static ListNode reverse(ListNode pre, ListNode kthNodeNext) {
ListNode first = pre.next;//保存第一个节点
ListNode prev = pre;
ListNode curr = pre.next;
ListNode next = curr.next;
while (curr != kthNodeNext) {
//reverse
curr.next = prev;
//next
prev = curr;
curr = next;
if(next != null){
next = next.next;
}
}
pre.next = prev;
first.next = curr;//现在第一个节点应该是k个节点中的最后一个节点了
return first;
}
}

Review 微服务架构模式系列

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

微服务架构-Pattern: Shared database

这篇文章的主要介绍了微服务架构下如何进行持久化:共享数据库

强制要求:

  1. 松耦合

  2. 某些业务跨多个服务

  3. 某些业务查询涉及的数据跨多个服务

  4. 某些查询需要聚合多个服务的数据

  5. 数据系统能够很容易复制和共享,以扩大规模

  6. 不同的服务有不同的数据存储要求

解决方法:

多个服务共享一个数据库,通过每个服务自由的访问其他服务涉及的表,使用本地事物保证一致性。

好处

  1. 使用本地事物保持一致性,实现简单

  2. 一个数据库操作比较简单

缺点

  1. 开发耦合 其他服务都要访问同一个表,改变表结构困难

  2. 运行耦合 一个服务可能影响其他服务的运行

  3. 每一个服务需要的数据库类型可能不一致

Tips Linux中查看文件内容的方法

记录我对于Linux的学习,文件相关的命令:

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

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



cat 最常用的方式是将文件一次性全部输出到标准输出,或者将几个文件合并为一个文件

cat [-AbeEnstTuv] [–help] [–version] fileName

cat b.txt
cat a.txt b.txt > c.txt

more 与cat类似,不过是以分页的形式输出,按空格可以向前,按b可以退后,

格式:more [-dlfpcsu] [-num] [+/pattern] [+linenum] [fileNames..]

常用参数:

-num 一次显示的行数

+num 从第 num 行开始显示

-s 当遇到有连续两行以上的空白行,就代换为一行的空白行

more b.txt
more +20 b.txt

less 与 more 类似,但使用 less 可以随意浏览文件,可以使用方向键控制方向,而且 less 在查看之前不会加载整个文件。

格式:less [options] filename

常用参数:

-e 当文件显示结束后,自动离开

-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件

-i 忽略搜索时的大小写

-m 显示类似 more 命令的百分比

-N 显示每行的行号

-s 显示连续空行为一行

#显示行号
less -N b.txt
## 分页显示进程信息
ps -aux | less

ps: more 与less的不同

  1. less提供了更丰富的控制方式,比如可以按键盘上下方向键显示上下内容,more不能通过上下方向键控制显示

  2. less不必读整个文件,加载速度会比more更快

  3. less退出后shell不会留下刚显示的内容,而more退出后会在shell上留下刚显示的内容

head 查看文件的开头部分的内容

格式:head [options] filename

常用参数:

-q 隐藏文件名

-v 显示文件名

-c<数目> 显示的字节数。

-n<行数> 显示的行数,默认为 10,即显示 10 行的内容

head b.txt

tail 查看文件的最后的内容,常用于查阅正在改变的日志文件

格式:tail [options] filename

-f 循环读取 常用于查阅正在改变的日志文件

-q 不显示处理信息

-v 显示详细的处理信息

-c<数目> 显示的字节数

-n<行数> 显示文件的尾部 n 行内容

tail -f xxx.log


Share

最近对Java虚拟机的探索使用 HSDB 查看 jvm 内存,可能会有不足之处,之后会根据理解继续修改。



发布于: 2020 年 07 月 20 日 阅读数: 18
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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