Algorithm:Leetcode 19. Remove Nth Node From End of List
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
解法一:双指针
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
if(n <=0)
return head;
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
ListNode p = dummyHead;
ListNode q = dummyHead;
int i=0;
for(; i<n && p!=null; i++) {
p = p.next;
}
if(i < n) {
// n is larger than list.size
return head;
}
// move to the end
while(p.next != null) {
p = p.next;
q = q.next;
}
// q.next is the nth from the end
q.next = q.next.next;
return dummyHead.next;
}
}
解法二:先遍历一次计算链表长度,从而计算出倒数第n个元素是整数第几个
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode removeNthFromEnd(ListNode head, int n) {
int size=0;
ListNode p = head;
while(p != null) {
p = p.next;
size++;
}
if(n <=0 || n > size)
return head;
ListNode dummyHead = new ListNode(-1);
dummyHead.next = head;
p = dummyHead;
int m = size - n;
while(m > 0) {
p = p.next;
m--;
}
p.next = p.next.next;
return dummyHead.next;
}
}
Review: The Huawei Sanction Might Just Pop the Tech Bubble
https://onezero.medium.com/the-huawei-sanction-might-just-pop-the-tech-bubble-f7e800e3174
随着美国对华为的制裁,Google、Intel、ARM等公司相继对华为“发难”,目前对华为来说是万分艰难的时刻。无论华为的结局如何,都将对全球科技和经济造成不利影响。如果华为因此而倒下,将会捅破科技泡沫。
华为是全球前十的最有价值的科技公司之一,其智能手机业务正逐渐抢占苹果公司的市场份额,但手机并不是华为唯一的主业,它也是通信基础设施建设的巨头。
The offensive potential of 5G was so great that if Australia were on the receiving end of cyber attacks on 5G infrastructure, the country could be seriously exposed
5G的攻击潜力是如此之大,以至于如果澳大利亚成为5G基础设施网络攻击的接受方,该国可能会受到严重的暴露
华为在5G上的领先,使得澳大利亚的一家谍报机构大为震惊,后者将其的调查结果出售给了美国。可事实上,并没有任何证据表明华为从事间谍工作,华为的领导人也深知从事这种工作对公司的危害。
从斯诺登事件,我们知道,美国国家安全局(NSA)对思科(Cisco)生成的路由器安装了“后门”,用于从事间谍工作。NSA的权利之大,几乎要不受控制了。
禁令将会使得华为丧失竞争力,所有的合作伙伴都担心被波及。谷歌收回对华为的Android授权,这件事对华为的影响看起来还不是很大。因为华为手机大部分的市场在中国,而在中国,谷歌服务本身就是不可用的,因此华为有自己的替代服务。但随着其他公司也逐渐停止和华为合作,华为将面临各种层面的挑战。
没有ARM,华为将失去有竞争力的手机芯片;没有高通,华为将不能用上最好的调制解调器(modems);没有Intel,华为将没有笔记本电脑……
The list goes on, and dismantling a single Huawei smartphone reveals how intimately tied together we all are as a result of globalization — it takes components sourced from many companies based in different countries to create a functional handset, with no single entity able to pull it off alone.
这样的例子不胜枚举,拆下一部华为智能手机就可以看出,由于全球化,我们所有人是多么紧密地联系在一起——要制造出一款功能齐全的手机,需要从许多总部位于不同国家的公司采购零部件,而没有任何一家实体能够独自完成这一任务。
几乎所有的美国科技企业(苹果、英特尔、高通……),都依赖于中国提供巨大的生产规模。
It would take years for U.S. companies to learn how to pull off building with the precision and scale of the Chinese, and they’d essentially be starting from scratch
美国企业基本上要从零开始,花费数年时间学会像中国人一样精确和大规模地建设。
由于智能手机和笔记本电脑的销量持续下滑,互联网科技企业都在寻求新的增长点,但至今情况还不太明朗,而贸易战无疑会使情况更加恶化。在情况变得更坏之前,中美达成一致,那是最好不过,但我们也不能盲目乐观。华为对于中国来说,是一家“大到不能倒”的企业,毫不怀疑中国会尽力帮助这家企业渡过难关,但是这样做代价是巨大的,到底会拖垮别的哪家企业就不得而知了。
Tip: MySQL事务隔离级别
- 读未提交:允许在一个事务中看到另一个事务未提交的修改,即会出现“脏读”,是最低的隔离水平。
- 读已提交:只能看到其他事务已经提交的修改,不会出现“脏读”。但不保证在一次事务中多次读会读到同样的值,即允许“不可重复读”和“幻读”存在。
- 可重复读(InnoDB默认):保证在一次事务中多次读同一份数据读到的值是一样的。是MySQL InnoDB引擎默认的隔离级别,和其他数据库实现不同的是,MySQL在“可重复读”级别不会出现“幻读”。
- 串行化:并发事务之间是串行化的,读取需要获取“共享锁”,更新需要获取“排他锁”。如果有 where 语句,还会获取“区间锁”。MySQL以GAP锁形式实现“区间锁”,“可重复读”级别默认也会使用“区间锁”。这是MySQL最高的隔离级别。
Share: iptables入门
在Linux中,真正的防火墙是 netfilter 框架,位于Linux内核空间;我们常见的iptables只是一个命令行工具,位于用户空间,可以通过它来和netfilter交互。
netfilter框架主要通过“表”和“链”来对数据包进行拦截、过滤和修改。“链”其实就是netfilter框架在几个关键节点提供的“钩子”(hooks),我们可以通过iptables命令行工具来往这些“链”上挂规则。netfilter的“链”按照数据包从流入到流出的方向来看,分别是 PREROUTING, FORWARDING, INPUT, OUTPUT, POSTROUTING。
PREROUTING链是数据包刚刚进来,还没决定是继续转发出去还是传给本地的应用程序,先处理一把;
FORWARDING就是在路由判断之后,发现不是给自己的,需要继续转发出去,此时对数据包先处理一把再转发出去;
INPUT是指数据包的目的地就是本机,在传给应用程序先,通过INPUT链处理一把;
OUTPUT是应用程序发出的数据包,先经过OUTPUT处理一把;
POSTROUTING就是数据包离开本机之前最后处理一把;
每一条“链”上都可以挂很多规则,没条规则对应一个动作,当满足规则时执行相应动作。只有一条链上所有的规则都匹配完之后,才会进入到下一条“链”。常见的匹配规则比如“源ip等于多少”、“目的ip等于多少”、“端口是多少”等等,对应的动作有如下几种:
ACCEPT:允许数据包通过
DROP:丢弃数据包,不给发送方任何回应,直到超时
REJECT:拒绝数据包通过,必要时会给发送方一个拒绝的回应
SNAT:源地址转换
MASQUERADE:特殊的SNAT,适用于动态的、会变的ip
DNAT:目的地址转换
REDIRECT:本地端口转发
LOG:只记录日志,不对数据包做任何处理,直接转发出去
每条“链”上都可以挂很多规则,规则多了就会比较乱,所以iptables设计了4种表来对这些规则分类管理,我们自定义的规则逃不出这4种类型。按照优先级排列分别是:
raw->mangle->nat->filter
当一条链上有多个表的规则时,按照上述的优先级来依次匹配。
这4种表的功能分别是
raw:关闭nat表启用的连接追踪机制
mangel:拆包、修改、重新封装
nat:对数据包做SNAT或者DNAT
filter:对数据包做过滤
并不是每一条“链”上都可以挂所有类型的规则,不同的关卡能做的事情还是有区别的。
PREROUTING链可以挂的表有:raw->mangle->nat
FORWARDING链可以挂的表有:mangle->filter
INPUT链可以挂的表有:mangle->filter
OUTPUT链可以挂的表有:raw->mangle->nat->filter
POSTROUTING链可以挂的表有:mangle->nat (是否有filter?)
日常使用时,我们往往是根据表来配规则,因为表描述的是功能,我们需要达到什么样的功能才配什么样的规则。比如我们想做nat,就需要知道可以在PREROUTING、OUTPUT和POSTROUTING链上配规则。因此,每个表可以用在什么链上,也是要熟悉的。
这篇文章的内容可以结合极客时间课程《趣谈网络协议》第26讲一起看。