逆序局部链表、Paxos 算法原理、架构师发现问题所在 John 易筋 ARTS 打卡 Week 19

用户头像
John(易筋)
关注
发布于: 2020 年 09 月 27 日

1. Algorithm: 每周至少做一个 LeetCode 的算法题

题目

92. Reverse Linked List II



Reverse a linked list from position m to n. Do it in one-pass.



Note: 1 ≤ m ≤ n ≤ length of list.

Example:



Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL



解答

逆序局部链表,关键是要记录逆序的开始的前一个点,和结束后的第一个点。

中间逆序,需要三个节点保存中间状态,跟全局逆序一样的思路即可。



重新定义链表,用于打印输出

package common;
public class ListNode {
public int val;
public ListNode next;
public ListNode(int val) {
this.val = val;
}
static public ListNode listNodeWithIntArray(int[] input) {
ListNode head = new ListNode(0);
ListNode node = head;
for (int i: input) {
ListNode newNode = new ListNode(i);
node.next = newNode;
node = node.next;
}
return head.next;
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
ListNode node = this;
while (node != null) {
sb.append(node.val).append("-->");
node = node.next;
}
return sb.append("Null").toString();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
return false;
}
}



算法实现

package linkedlist;
import common.ListNode;
// https://leetcode.com/problems/reverse-linked-list-ii/
public class ReverseLinkedListII {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null || head.next == null || m == n) {
return head;
}
ListNode dummyNode = new ListNode(0);
dummyNode.next = head;
ListNode begin = dummyNode;
int gap = n - m;
// find the begin of reversion
while (m > 1) {
begin = begin.next;
m--;
}
ListNode pre = begin;
begin = begin.next;
ListNode fast = begin.next;
ListNode slow = begin;
// reverse end
ListNode next;
while (gap > 0) {
next = fast.next;
fast.next = slow;
slow = fast;
fast = next;
gap--;
}
// pre -> next is the last one;
pre.next = slow;
// end -> next is the next;
begin.next = fast;
return dummyNode.next;
}
public static void main(String[] args) {
ReverseLinkedListII obj = new ReverseLinkedListII();
int[] input = {1, 2, 3, 4, 5};
ListNode head = ListNode.listNodeWithIntArray(input);
System.out.println("init ListNode");
System.out.println(head.toString());
//ListNode result = obj.reverseList(head);
//ListNode result = obj.reverseListWithRecursive(head);
ListNode result = obj.reverseBetween(head, 2, 4);
System.out.println("result ListNode");
System.out.println(result.toString());
}
}



2. Review: 阅读并点评至少一篇英文技术文章

Getting Started With RxSwift and RxCocoa



响应式编程RxSwift 入门教程,响应式编程主要是通过观察者模式监听所有事件的变化,通过链式模式,在应用层简化流程,使开发起来更有控制感。



3. Tips: 学习至少一个技术技巧

Paxos 算法



学习了Paxos算法:

角色定义

Paxos一共4个角色:Client , Proposer , Acceptor , Learner。

  • Client:产生议题者.

  • Proposer :提议者/提案者,它可以提出一个提案。一个提案由一个编号及value形成的对组成,如 [m, value],提案的编号必须是全局唯一,value即代表了提案本身的内容。

  • Acceptor:决策者, 提案的受理者,有权决定是否它本身是否批准该提案。

  • Learner:最终决策学习者,也就是执行者。不参与Paxos提案选定的过程,只在提案被选定时,知道提案结果的角色。



Learner最终学习的目标是向所有Acceptor学习,如果有多数派个Acceptor最终接受了某提议,那就得到了最终的结果,算法的目的就达到了。





4. Share: 分享一篇有观点和思考的技术文章

笔者写的博客链接



极客大学架构师训练营发现问题的真正所在、技术领导者的7种武器、架构师之道 第30课 最后一课 听课总结



说明

讲师:首席架构师:李智慧



1. 发现问题的真正所在

1.1 问题发现模式

  1. 人们经常会把解决问题当做问题的定义,而解决方案往往来自口才最好的那个人(或者最有权威的那个人)。-- 猜对大老板的问题,才能破解彼得定律。大老板是要提拔真正有能力、有格局的人。不靠谱的方案,要变成口才最好的人,把不靠谱的方案搅黄了。



  1. 绝大多数人只知道自己要执行的解决方案,而不知道自己面对的问题是什么。



  1. 问题 = 期望 - 体验



  1. 处理关系优于解决问题。



  1. 太多的问题被人们的适应能力忽略掉了,直到有人解决了这些问题。 -- 阿里软件 解散高手的段子。



1.2 问题提出模式

  1. 如果某人能够解决问题,而TA自己却感受不到问题,那么就让TA感受一下。



  1. 如果你想解决一个问题,试试【让情况变得更糟】(亡羊补牢)。



  1. 把【我的问题】表述成【我们的问题】。



  1. 给上司提封闭式问题,给下属提开放式问题。

  2. 直言有讳

  3. 批评而不是责难,对事不对人。



1.3 问题解决模式

  1. 你没有解决问题,你只是用另一个问题代替这个问题。

  2. 解决问题之前先想想这是谁的问题,你要取悦谁。

  3. 许多时候你不需要提出解决方案,你只需要提醒问题的存在。

  4. 以赞成的方式表示反对。

  5. 把【我的问题】变成【你的问题】。

  6. 把【他的问题】变成【我的问题】。

  7. 适当的逃避问题(这个 idea 非常好,让我们组织一个会议好好讨论一下)。

  8. 如果你不填老板想要的答案,你就是个傻瓜(一个管理者想要什么样的下属,就会带出什么样的下属)。

  9. 如果明天早上所有困扰你的问题都消失了,你打算干什么?



1.4 问题不重要、未来才重要

  1. 聚焦目标,而不是问题,不是所有问题都需要解决,不是所有问题都要分析清楚才能解决。

  2. 关注问题解决后发生什么,不要关注问题是如何发生的。

  3. 多问自己:我到底想要什么;少问自己:我究竟有什么问题。



发布于: 2020 年 09 月 27 日 阅读数: 24
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。开发过日活过亿的淘宝Taobao App,擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
逆序局部链表、Paxos算法原理、架构师发现问题所在 John 易筋 ARTS 打卡 Week 19