ARTS打卡:第二十四周
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Algorithm
Review
Tip
Share
本周分享知秋大大带来的:Spring Reactor 全新解读系列 2019-2020 全集 (更新中)
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
本周分享知秋大大带来的:Spring Reactor 全新解读系列 2019-2020 全集 (更新中)
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。
注意:答案中不可以包含重复的三元组。
1 | 例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4], |
链接: https://leetcode.com/problems/3sum/
a+b=-c
的 a、b值1 | class Solution { |
ps:LeetCode的这道题是有问题的,题目中强调:答案中不可以包含重复的三元组,但是加入三元组的判重条件,又会导致通过不了(:зゝ∠),所谓的不可以包含重复的三元组,就是不能 [0,0,0],所以下面的答案是没有三元组的判重条件的
结果:
Runtime: 25 ms, faster than 98.84% of Java online submissions for 3Sum.
Memory Usage: 45.5 MB, less than 96.47% of Java online submissions for 3Sum.
复杂度:
时间复杂度:O(n²)
空间复杂度:O(1)
本周阅读:
《 Disruptor: High performance alternative to bounded queues for exchanging data between concurrent threads 》,通过阅读这篇技术论文,我们就能知道 Disruptor 它试图解决什么问题,并能了解 Disruptor 这个并发框架为什么那么快的原因。
扩展阅读:
《Dissecting the Disruptor: What’s so special about a ring buffer?》
《Dissecting the Disruptor: How do I read from the ring buffer?》
这次分享如何在Linux下进行抓包,在Windows下进行抓包,可以点击查看这篇文章:《Wireshark使用详解以及HTTP抓包》。
在Linux下抓包,可以采用 tcpdump
安装命令:yum install tcpdump
简单分享几个命令:
监控指定网卡上的所有数据
1 | $ tcpdump -i eth0 |
查看指定IP上的进出流量
1 | $ tcpdump host x.x.x.x |
根据来源和目标进行筛选,
1 | $ tcpdump src x.x.x.x |
将捕获的数据包保存至文件或读取数据包文件。
1 | # 使用 -w 保存至文件 |
想要了解更多内容,小伙伴们可以点击查看:《A tcpdump Tutorial with Examples — 50 Ways to Isolate Traffic》,不想看英文的小伙伴可以点击查看这篇译文:[译]tcpdump 示例教程。
本周继续分享 simviso 团队译制的《斯坦福编译原理》系列视频,这周已更新至25集,感兴趣的小伙伴们,赶紧追起来呀,合集地址:【国外精选视频课】斯坦福编译原理(中文翻译) 合集 更新中。
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
1 | 给定一个链表: 1->2->3->4->5, 和 n = 2. |
说明:
给定的 n 保证是有效的。
进阶:
你能尝试使用一趟扫描实现吗?
链接:https://leetcode.com/problems/remove-nth-node-from-end-of-list/
普通思路:
先遍历计算出这个链表的节点数 count
因为 n 是指链表的倒数第 n 个节点,所以链表的第 (count - n + 1)个节点就是我们要删除的节点
进阶思路:
采用快慢指针的思想,只需使用一趟扫描实现:
普通版实现:
1 | class ListNode { |
结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Remove Nth Node From End of List.
Memory Usage: 34.8 MB, less than 100.00% of Java online submissions for Remove Nth Node From End of List.
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
进阶版:
1 | class ListNode { |
结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Remove Nth Node From End of List.
Memory Usage: 34.6 MB, less than 100.00% of Java online submissions for Remove Nth Node From End of List.
复杂度:
时间复杂度:O(n)
空间复杂度:O(1)
本周回看了之前分享的几篇有关于 I/O 模型的文章:
《UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking 》中的 6.2 I/O Models。
Thousands of Threads and Blocking l/O:The Old Way to Write Java Servers Is New Again(and Way Better)
本周分享一个学习数据结构和算法的小技巧:通过 VisuAlgo 网站,可以看到动态可视化的数据结构和算法,结合动图,我们能更容易理解数据结构和算法的实现过程。
最近的都在追 simviso 团队译制的《斯坦福编译原理》系列视频,哇哈哈哈,感兴趣的小伙伴们赶紧跟上鸭( ̄▽ ̄)”
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""
。
示例 1:
1 | 输入: ["flower","flow","flight"] |
示例 2:
1 | 输入: ["dog","racecar","car"] |
说明:
所有输入只包含小写字母 a-z
。
链接:https://leetcode.com/problems/longest-common-prefix/
这个题的目的是找出所给数据组中的最长公共前缀,那我们可以在数组内任选一个字符串,拿它的所有前缀子串分别去匹配剩余的字符串的前缀,最后找出能够匹配所有剩余字符串的最长前缀子串即可。
1 | class Solution { |
执行结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Longest Common Prefix.
Memory Usage: 37.5 MB, less than 87.13% of Java online submissions for Longest Common Prefix.
请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除的节点。
现有一个链表 – head = [4,5,1,9],它可以表示为:
4 -> 5 -> 1 -> 9
示例 1:
1 | 输入: head = [4,5,1,9], node = 5 |
示例 2:
1 | 输入: head = [4,5,1,9], node = 1 |
说明:
链表至少包含两个节点。
链表中所有节点的值都是唯一的。
给定的节点为非末尾节点并且一定是链表中的一个有效节点。
不要从你的函数中返回任何结果。
链接:https://leetcode-cn.com/problems/delete-node-in-a-linked-list/
根据题意,我们是拿不到给定节点的前驱节点,只能拿到后继节点,那么实现删除节点思路就是将后继节点值覆盖当前节点,以此类推,直至尾节点,最后将尾节点置为null即可,我们可以通过递归来做。
1 | public class Solution { |
执行结果:
Runtime: 0 ms, faster than 100.00% of Java online submissions for Delete Node in a Linked List.
Memory Usage: 36.8 MB, less than 100.00% of Java online submissions for Delete Node in a Linked List.
本周阅读的是:《Understanding Reactor Pattern: Thread-Based and Event-Driven》
作者开头从 thread-base(基于线程)架构和 event-driven(事件驱动)架构切入,然后具体介绍了Reactor Pattern。
基于线程的架构,即一个线程对应一个连接,适用于需要兼容非线程安全的库的程序,同时也指出了 thread-base 架构存在进程过于重量级、上下文切换缓慢和高内存消耗的情况,以及线程与连接一一对应的关系,导致了一旦存在大量的长连接,就会有大量的工作线程处于空闲等待状态,浪费了大量的内存堆栈。
事件驱动结构,可以将线程与连接分隔开来,仅将线程用于特定的回调或处理程序上的事件。
Reactor Pattern 是事件驱动架构的一种实现技术,简单来说,就是用单线程对资源发出的事件进行循环阻塞,并将它们分发给相应的处理程序和回调。只要事件的处理程序和回调被注册了,就不需要阻塞 I/O,这种模式将模块化应用程序级别的代码与可重用的响应式实现解耦。
Reactor 和 Handlers 是 Reactor Pattern 架构的两个重要参与者。
reactor 运行在一个独立的线程中,主要是用于将工作分发给对应的处理程序去处理 I/O 事件。
handler 则是处理与 I/O事件有关的实际工作。
Reactor Pattern 的目的是允许事件驱动的应用程序,可以对来自一个或多的客户端请求进行多路复用和分发。
本周分享阿里开源的项目:Arthas
最近用的比较多的是 trace 命令,它可以显示方法内部调用路径,并输出方法路径上的每个节点上耗时。
在进行压测的时候,我们可以在后台执行 trace 命令(trace -j class-pattern method-pattern -n xxx > xxx/xxx.log &
),等压测完毕后,解析输出的日志文件,可以算出指定方法的平均耗时、最小耗时和最大耗时;我们可以根据耗时情况,查看对应的代码,然后着手进行优化,这对我们在进行性能调优时,有一定的指导作用和帮助。
还有很多其他实用的命令,感兴趣的朋友们可以查看:《Arthas 用户文档》。
本周继续分享 simviso 团队带来的《斯坦福编译原理》译制视频:
ps:知秋大大带领的 simviso 还在不断的更新,感兴趣的小伙伴们赶紧跟上鸭( ̄▽ ̄)”
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
报数序列是一个整数序列,按照其中的整数的顺序进行报数,得到下一个数。其前五项如下:
1 | 1. 1 |
1
被读作 "one 1" ("一个一")
, 即 11
。11
被读作 "two 1s" ("两个一")
, 即 21
。21
被读作 "one 2", "one 1" ("一个二" , "一个一")
, 即 1211
。
给定一个正整数 n(1 ≤ n ≤ 30),输出报数序列的第 n 项。
注意:整数顺序将表示为一个字符串。
示例 1:
1 | 输入: 1 |
示例 2:
1 | 输入: 4 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/count-and-say
这道题其实并不难,只要理解了题目的意思,这道题就很容易解出来了。
仔细阅读题目,你会发现从报数序列1开始,往后的序列,都是基于上一个报数序列来得出结果的;报数结果可以拆分两个数,一个是要报的数字,假设为:say,一个是要报数的个数,假设为 count,比如说1
被读作 "one 1" ("一个一")
,那么 say = 1,count = 1,以此类推即可。
1 | class Solution { |
执行结果:
执行用时 :3 ms, 在所有 Java 提交中击败了94.08%的用户
内存消耗 :34.9 MB, 在所有 Java 提交中击败了85.08%的用户
作者在文中深入的介绍了 Java的 内存管理机制,大致可以概括为以下几点:
-XX:+UseSerialGC
-XX:+UseParallelGC
-XX:+UseG1GC
-XX:+UseConcMarkSweepGC
来使用它。JDK9开始,这种GC类型被声明为deprecated
,不再推荐使用。这周分享一些 Linux 命令:
ulimit -n
:查看系统默认的最大文件句柄数,系统默认是1024lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
:查看当前进程打开了多少句柄数ulimit -HSn 4096
:以root用户运行,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。应用场景:解决Linux系统报出 “too many open files” 的错误。
参考链接:
https://blog.csdn.net/lastsweetop/article/details/6440136
https://blog.csdn.net/lck5602/article/details/79670147
本周继续分享simviso团队带来的优质翻译学习视频:《国外精选翻译课程之编译原理入门》
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
实现 strStr() 函数。
给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始)。如果不存在,则返回 -1。
示例 1:
1 | 输入: haystack = "hello", needle = "ll" |
示例 2:
1 | 输入: haystack = "aaaaa", needle = "bba" |
说明:
当 needle
是空字符串时,我们应当返回什么值呢?这是一个在面试中很好的问题。
对于本题而言,当 needle
是空字符串时我们应当返回 0 。这与C语言的 strstr() 以及 Java的 indexOf()) 定义相符。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/implement-strstr
这是一道字符串匹配的问题,如果有了解过字符串匹配算法的小伙伴们,这道题肯定不在话下。
著名的字符串匹配算法有:BF算法(Brute Force 暴力匹配算法,又称朴素匹配算法。)、RK算法(Rabin-Karp BF算法的升级版) BM算法、KMP算法、AC算法等,出了AC算法外,其余算法都可以直接套用,拿来解这道题。
1 | public class Soulation { |
执行结果:
执行用时 :1 ms, 在所有 Java 提交中击败了99.25%的用户
内存消耗 :36.4 MB, 在所有 Java 提交中击败了82.76%的用户
哈哈哈,这种利用 API 解题,有很大取巧成分,身为三好青年的我们,还是要学习下源码的,源码取自JDK8
,讲解转自
1 | /** |
1 | class Solution { |
执行结果:
执行用时 :1 ms, 在所有 Java 提交中击败了99.25%的用户
内存消耗 :36.2 MB, 在所有 Java 提交中击败了83.48%的用户
1 | class Solution { |
执行结果:
执行用时 :4 ms, 在所有 Java 提交中击败了41.67%的用户
内存消耗 :36 MB, 在所有 Java 提交中击败了84.01%的用户
当然我们还可以采用RK
算法、BM
算法或KMP
算法去做,不过步骤就比较繁琐,我就不列出来了,小伙伴,可以自行了解一下。
以下链接,是我的学习BM算法和AC算法的笔记,感兴趣的小伙伴们,也可以查看一下👀
本周阅读:The JVM Architecture Explained
作者在文中详细的介绍了JVM的体系结构以及JVM不同组件,感兴趣的小伙们可以自行查阅。
最近遇到一个问题,在这里记录一下解决方案。
背景:存在主从两台服务器,主机做 nfs的服务端,从机做客户端;由于服务器IP的更换,导致 nfs服务端了挂了,nfs客户端直接卡死,导致尝试访问挂载目录、df -h等操作都会使终端卡住,ctrl+c也不能强行退出,尝试过 kill - 9 也不起作用。
解决办法:先是采用 umount -f NFS挂载目录
命令(-f 强制卸载),然后报device is busy
的错误,然后尝试umount -l NFS挂载目录
命令(-l 当设备空闲时,进行umount),等了一会,发现 umount 成功了,还可以先用命令ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,最后进行 umount 。
原因:
nfs服务器/网络挂了,nfs客户端默认采用hard-mount选项,而不是soft-mount。他们的区别是
soft-mount: 当客户端加载NFS不成功时,重试retrans设定的次数.如果retrans次都不成功,则放弃此操作,返回错误信息 “Connect time out”
hard-mount: 当客户端加载NFS不成功时,一直重试,直到NFS服务器有响应。hard-mount 是系统的缺省值。在选定hard-mount 时,最好同时选 intr , 允许中断系统的调用请求,避免引起系统的挂起。当NFS服务器不能响应NFS客户端的 hard-mount请求时, NFS客户端会显示
“NFS server hostname not responding, still trying”
————————————————
原文链接:https://blog.csdn.net/BrotherDong90/article/details/51735632
参考的博客:
https://blog.csdn.net/BrotherDong90/article/details/51735632
https://my.oschina.net/LastRitter/blog/1542610
https://blog.csdn.net/xiyangyang8/article/details/49725039
本周分享 simviso 团队翻译制作的:《编译原理入门之编译阶段概述》
让我们跟随知秋大大一起学习的吧😄~
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Implement
atoi
which converts a string to an integer.The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an optional initial plus or minus sign followed by as many numerical digits as possible, and interprets them as a numerical value.
The string can contain additional characters after those that form the integral number, which are ignored and have no effect on the behavior of this function.
If the first sequence of non-whitespace characters in str is not a valid integral number, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.
If no valid conversion could be performed, a zero value is returned.
Note:
- Only the space character
' '
is considered as whitespace character.- Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. If the numerical value is out of the range of representable values, INT_MAX (231 − 1) or INT_MIN (−231) is returned.
Example 1:
Input: “42”
Output: 42Example 2:
Input: “ -42”
Output: -42
Explanation:The first non-whitespace character is ‘-‘, which is the minus sign.
Then take as many numerical digits as possible, which gets 42.
Example 3:
Input: “4193 with words”
Output: 4193
Explanation: Conversion stops at digit ‘3’ as the next character is not a numerical digit.Example 4:
Input: “words and 987”
Output: 0
Explanation: The first non-whitespace character is ‘w’, which is not a numerical digit or a +/- sign. Therefore no valid conversion could be performed.Example 5:
Input: “-91283472332”
Output: -2147483648
Explanation: The number “-91283472332” is out of the range of a 32-bit signed integer.Thefore INT_MIN (−231) is returned.
请你来实现一个 atoi 函数,使其能将字符串转换成整数。
首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。
当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。
该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。
注意:假如该字符串中的第一个非空格字符不是一个有效整数字符、字符串为空或字符串仅包含空白字符时,则你的函数不需要进行转换。
在任何情况下,若函数不能进行有效的转换时,请返回 0。
说明:
假设我们的环境只能存储 32 位大小的有符号整数,那么其数值范围为 [−231, 231 − 1]。如果数值超过这个范围,请返回 INT_MAX (231 − 1) 或 INT_MIN (−231) 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/string-to-integer-atoi
仔细阅读题目,我们可以从中得出这道题的限制条件:
根据以上的限制,我们的解题思路就可以这样:
1 | public class Solution{ |
Runtime: 3 ms, faster than 25.42% of Java online submissions for String to Integer (atoi).
Memory Usage: 37 MB, less than 81.37% of Java online submissions for String to Integer (atoi).
emm….解是解出来了,但结果就不怎么理想了,代码也太冗余了点
与解题思路(1)一致,代码上进行调整,减少for循环,降低时间复杂度,详情查看代码实现。
1 | public class Solution{ |
运行结果
Runtime: 1 ms, faster than 100.00% of Java online submissions for String to Integer (atoi).
Memory Usage: 36 MB, less than 100.00% of Java online submissions for String to Integer (atoi).
复杂度分析
时间复杂度:O(n),n是有效字符长度
空间复杂度:O(1)
本周分享:How To Ask Questions The Smart Way
对应的简体中文翻译版:提问的智慧
经久不衰的文章,很值得我们再看一遍。
本周分享从《SQL必知必会》专栏中,学习到的索引知识和SQL调优的Tip:
ps:思维导图中的图片都来源于专栏,以上是学习笔记
OpenLDAP 是一款轻量级目录访问协议(Lightweight Directory Access Protocol, LDAP), 属于开源集中账号管理架构的实现,且支持众多系统版本,被广大互联网公司所采用。
LDAP 具有两个国家标准,分别是 X.500 和 LDAP。OpenLDAP 是基于 X.500 标准的,而且去除了 X.500 复杂的功能并且可以根据自我需求定制额外扩展功能,但是 X.500 也有不同之处,例如 OpenLDAP 支持 TCP/IP 协议等,目前 TCP/IP 是 Internet 上访问互联网的协议。
OpenLDAP 则直接运行在更简单和更通用的 TCP/IP 或其他可靠的传输协议层上,避免了在 OSI 会话层和表示层的开销,使连接的建立和包的处理更简单、更快,对于互联网和企业网应用更理想。LDAP 提供并实现目录服务的信息服务,目录服务是一种特殊的数据库,对于数据的读取、浏览、搜索有很好的效果。目录服务一般用来包含基于属性的描述性信息并支持精细复杂的过滤功能,但 OpenLDAP 目录服务不支持通用数据库的大量更新操作所需要的复杂的事务管理或回滚策略等。
OpenLDAP 默认以 Berkeley DB 作为后端数据库,Berkeley DB 数据库主要以散列的数据类型进行数据存储,如以键值对的方式进行存储。Berkeley DB 是一类特殊的数据库,主要作用于搜索、浏览、更新查询操作,一般用于一次写入数据、多次查询和搜索有很好的效果。Berkeley DB 数据库时面向查询进行优化,面向读取进行优化的数据库。Berkeley DB 不支持事务性数据库(MySQL、MariDB、Oracle 等)所支持的高并发的吞吐量以及复杂的事务操作。
OpenLDAP 目录中的信息是按树形结构进行组织的,具体信息存储在条目(entry)中,条目可以看成关系数据库中的表记录,条目是具有区别名(Distinguished Name,DN)的属性(attribute),DN 是用来引用条目,DN 相当于关系型数据库(MySQL 等)中的主键(primary key),是唯一的。属性由类型(type)和一个或多个值(value)组成,相当于关系型数据库中字段的概念。
来源:https://wiki.shileizcc.com/confluence/display/openldap/OpenLDAP
使用 yum 安装(推荐)
命令:yum -y install openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql openldap-devel migrationtools
使用下载好的rpm进行安装(无网/内网环境下推荐)
先在可以联网的机器下,下载好对应的 rpm 文件,然后拷贝到无网/内网环境下的机器。
先确保目标机器有安装好yum,需要用yum对下载好的rpm 进行本地安装,好处在于无需明确rpm的安装顺序,仅使用rpm 命令来安装,依照依赖顺序,一个一个安装rpm,很反人类。
在能联网的机器上通过yum 下载rpm,需要先安装yum-plugin-downloadonly
命令:yum -y install yum-plugin-downloadonly
yum-plugin-downloadonly 安装完成后,通过以下命令下载rpm
命令:yum -y install --downloadonly --downloaddir=/xxx
openldap compat-openldap openldap-clients openldap-servers openldap-servers-sql
openldap-devel migrationtools
注意:–downloaddir=/xxx指定rpm的下载目录
注意:
我的虚拟机已经安装了一些rpm,实际上所需的 rpm包不止这些。
yum -y install --downloadonly --downloaddir=/xxx rpm_name
:这个命令是有缺陷的,就是系统已有的rpm包,不会重复下载,所以建议在一个比较干净的虚拟机做这个事情。
通过 yum localinstall /usr/openldap/rpm/*.rpm
来安装 rpm
安装成功后,使用以下命令查看 OpenLDAP 的版本信息
slapd -VV
需要先产生密码
命令:slappasswd -s 12345678
记录结果,这是加密后的结果:{SSHA}rjewoTmrrSYQGis4YddObtvK88G/amXy
创建用户跟根节点
修改/etc/openldap/slapd.d/cn=config
目录下的olcDatabase={2}hdb.ldif
文件
例如,创建如下根节点、用户名称和密码
1 | olcSuffix: c=cn |
其中:
1 | olcSuffix: 为根节点 |
将下图:
改为:
修改olcDatabase={1}monitor.ldif
文件
执行命令:vi olcDatabase\=\{1\}monitor.ldif
将下图:
改为:
保存退出
进行校验
使用slaptest -u
,对配置内容进行校验
checksum校验码出错无所谓,最后一句可行即可。
修改ldap.conf
配置文件
文件路径:/etc/openldap/ldap.conf
将下图:
改为:
注意:URL后的内容填写服务器域名或者IP+端口(端口不写就是采用默认:389的),我填写的是自己虚拟机的地址。
重启OpenLDAP
使用以下命令进行重启
1 | systemctl restart slapd |
可以采用 ApacheDirectoryStudio 工具测试连接是否成功。
Hostname:是步骤5写的URI
Port:缺省值是389,如果自行改了,则用改的那个
账户用步骤二设置的值,密码用步骤一加密之前的值
设置完后,点finish,出现最后一张图的情况,就是成功了
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: “A man, a plan, a canal: Panama”
Output: trueExample 2:
Input: “race a car”
Output: false
给定一个字符串,判断它是否是回文,只考虑字母数字字符且忽略大小写。
注意:为了解决这个问题,我们将空字符串定义为有效的回文。
这题很简单,根据题意,得出以下两个限制条件:
那么解法就显而易见了:
1 | class Solution { |
运行结果:
Runtime: 18 ms, faster than 23.43% of Java online submissions for Valid Palindrome.
Memory Usage: 37.8 MB, less than 96.94% of Java online submissions for Valid Palindrome.
复杂度分析:
暂未清楚如何分析….🕊
借鉴散列表的思想,换一个解题角度出发(嘿嘿嘿,是不是发现跟上周的解题思路类似呢😜):
结合代码,更容易理解哟(^U^)ノ~YO
1 | class Solution{ |
结果:
Runtime: 1 ms, faster than 100.00% of Java online submissions for Valid Palindrome.
Memory Usage: 37.7 MB, less than 98.83% of Java online submissions for Valid Palindrome.
时间复杂度:O(n)
空间复杂度:O(n)
本周阅读的是:Java (JVM) Memory Model – Memory Management in Java
作者在文中通俗的介绍了:Java内存模型、Java内存管理、Java 垃圾回收、Java 内存监控的命令与工具以及关于垃圾回收调优的建议,值得小伙伴们一看。
部分笔记如下:
本周分享:从单体应用到微服务的开发旅程
每周完成一个ARTS:
- Algorithm:每周至少做一个 leetcode 的算法题
- Review:阅读并点评至少一篇英文技术文章
- Tip:学习至少一个技术技巧
- Share:分享一篇有观点和思考的技术文章
Given two strings s and t , write a function to determine if t is an anagram of s.
Example 1:
Input: s = “anagram”, t = “nagaram”
Output: trueExample 2:
Input: s = “rat”, t = “car”
Output: falseNote:
You may assume the string contains only lowercase alphabets.Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。
说明:
你可以假设字符串只包含小写字母。
1 | class Solution { |
运行结果:
Runtime: 6 ms, faster than 43.67% of Java online submissions for Valid Anagram.
Memory Usage: 37.5 MB, less than 72.58% of Java online submissions for Valid Anagram.
复杂度分析:
时间复杂度:假设 Arrays.sort 的时间复杂度为 O(nlogn),最后排序的时间复杂度为 O(n),那么最终的时间复杂度为 O(nlogn)。
空间复杂度:取决于字符串的长度,这里假设为 O(n)
借鉴散列表的思想,换一个解题角度出发:
1 | class Solution { |
运行结果:
Runtime: 4 ms, faster than 78.57% of Java online submissions for Valid Anagram.
Memory Usage: 36.2 MB, less than 99.41% of Java online submissions for Valid Anagram.
复杂度分析:
时间复杂度:只有两个遍历,即时间复杂度为 O(n)
空间复杂度:只额外使用了 数组 table[26],所以空间复杂度为 O(1)
我们作为新生代的三好青年,当然要想想有没有比解法二更快的解法啦🤣~
我们可以从解法(2)出发,在此基础上进行优化,比如char 和 int 之间存在隐式转换,那么我们可以直接将字符作为 int[] 的下标,去掉 String.charAt() - ‘a’ 的消耗。
1 | class Solution { |
运行结果:
Runtime: 2 ms, faster than 99.82% of Java online submissions for Valid Anagram.
Memory Usage: 36.4 MB, less than 99.35% of Java online submissions for Valid Anagram.
复杂度分析:
时间复杂度:只有两个遍历,即时间复杂度为 O(n)
空间复杂度:只额外使用了整形数组 table[256],所以空间复杂度为 O(1)
本周阅读的是:What is Test-Driven Development (TDD)?
作者在文中介绍了什么是TDD(测试驱动开发)?并详细阐述了为什么TDD(测试驱动开发)在企业应用程序中是很重要的,以及对测试用例的覆盖率,进行了讨论,作者认为测试用例的覆盖率无需时刻做到100%,100%的代码覆盖率,不应该成为追求的目标,应该视业务场景而定,比如复杂的业务,可能需要做到90%,简单新功能,可能做到50%就可以了。
本周分享 Intellij IDEA 的两个快捷键:
Ctrl+F12
:可以快速定位到当前类的任何方法和变量。Alt+F7
:Find Usages
,从名字上就可以看出来了,可以快速的定位到类或方法或变量的任何被引用的地方。本周分享:Spring Boot vs. Spring MVC vs. Spring: How Do They Compare?
译文可以看这篇:Spring、Spring MVC、Spring Boot三者的关系还傻傻分不清楚?