ARTS (第48周)
如同认知世界,要先接近技术,才能学习到技术。
Algorithm 算法
字符串的排列
1 | 题目描述 |
解法1
每次将首位和其它位置更改,然后从下一位开始递归的解法。
1 | public ArrayList<String> Permutation_(String str) { |
解法2 字典序算法
注释里写了思路
1 | // https://blog.csdn.net/qq_40688707/article/details/80430661 |
数组中出现次数超过一半的数字
1 | 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。 |
解法1 排序法
因为多了个不满足条件的判断,所以需要一轮额外的循环
还可以用map记录每种数字出现次数的暴力法等,这种写法比较简单,这里我就不写了。
1 | public int MoreThanHalfNum_Solution_(int[] array) { |
解法2 摩尔投票法
1 | // 摩尔投票法 |
最小的K个数
1 | 输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。 |
解法1 排序法
构建堆的思路 其实和这里是一样的,也是排序后获取前n个
1 |
|
解法2 使用快排的部分算法 通过找出基准点 当基准点是k的时候,就代表前k个数字已经选出来了。
1 | public ArrayList<Integer> GetLeastNumbers_Solution__(int[] input, int k) { |
解法3 部分选择排序
非完整选择排序,仅循环k次,即时间复杂度为k*n
1 | // 选择排序 |
解法4 选择排序混合解法
在n和k差距较大的时候,有一定程度的优化,最差情况等于n^2
1 | // 看了题解 一个从选择排序改进来的混合的解法 复杂度从变成(n^2)变成了((n-k)^2+k^2) |
连续子数组的和
1 | HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学。今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决。但是,如果向量中包含负数,是否应该包含某个负数,并期望旁边的正数会弥补它呢?例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止)。给一个数组,返回它的最大连续子序列的和,你会不会被他忽悠住?(子向量的长度至少是1) |
解法1 动态规划
1 | public int FindGreatestSumOfSubArray_1(int[] array) { |
解法2 动态规划优化
其实这题做过,最先想到的是这种写法,本质也是动态规划
1 | public int FindGreatestSumOfSubArray_(int[] array) { |
解法3 递归分治
偶然想起这题在哪里看到过,有一个分治写法,就去找了找思路写了出来,
将每个序列都分成不包含中点的左序列或右序列,以及包含中点的序列,然后递归从查找。
这种思路是好的,将大问题拆成小问题进行查找,但是这题有更好的解法。如动态规划。
1 | // 分治辅助 |
整数中1出现的个数
1 | 求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。 |
解法1暴力法
优点是思路简单,缺点是时间复杂度n,而且会创建n个string类型的变量。
1 | // 暴力法 |
解法2 题解里看到的解法
归纳特征,然后整合
1 | public int NumberOf1Between1AndN_Solution(int n) { |
解法3数学公式归纳
参考自 https://www.jianshu.com/p/109fce1289e6
数学公式归纳
1 | // 数学归纳 |
Review 英文文章
http://kafka.apache.org/quickstart
kafka 的helloword
Tip 技巧
一、第一阶段“不知道自己不知道”,也就是无知,人所处的盲区。比如,我们以前在管理孩子时,认为要给孩子指出问题,让他改正才是对孩子的负责,因此我们不断看到孩子的问题并指出来。结果问题永远改不完,还导致孩子和家长对着干。我们以为家长已经尽力了,孩子就是不懂事不理解大人的良苦用心,其实这就是家长处在了管教孩子的无知盲区之中,不知道自己因为方法不当错误的管教孩子,还以为己做的很对。再比如你吃完饭脸上粘上一颗米粒,你没照镜子也没有和说的,你不知道,可能还觉得自己很美、到处炫耀你的靓丽呢。我上高一时不知道什么是“相对论”,但还和同学辩论的津津有味,现在想来真可笑。当自己不知道自己的无知时,看到的是别人做的不对,自己不会改正错误,也无从下手改正。
无知的原因受个人成长、家庭、文化的影响。例如,从孩子的问题入手管教孩子,是从家族的管理模式中学来的。有人说:“只有人家夸你的孩子好,哪有自己夸自家孩子好的,把他夸骄傲了怎么办。”这就是她的谦虚的传统认知,实际上她不知道现在很多父母以夸孩子为主。再比如一家人吃饭,是谁有空谁吃还是人凑齐了一起吃,不同的家庭有不同的习惯。我们在公共场合的大声喧哗,不出国门你不知道有些文明与我们很不同。
二、当别人帮你指出来,通过观察学习发现自己无知时,你就进入了“知道自己不知道”的阶段,开始有了自知。人贵有自知之明,当我们知道自己无知时,也就能谦虚向他人学习了。比如,当孩子出现不努力学习的问题时,我知道我的管理方法有问题了,我止住我原来的错误做法,开始走向新的学习之路。
三、当我们不断的学习,向他人请教,我们逐渐知道了很多知识,就进入了“知道自己知道”的觉察状态,能时刻反思自己的做法是否正确有效。比如我在管教孩子时,我对孩子的行为不满,一旦采取了打骂指责的办法,我当即觉察到这个办法无效且有害,立即止住、调整思维方向,发现孩子积极正向的动机,满足孩子的心理价值需要,向孩子表达我的感觉,孩子的行为就自动转化了。再比如,当我遇到困难时,一旦出现心烦气躁、抱怨他人的现象,立即觉察到这个方向无效,迅速止住、改变模式,改为我做些什么就能有所变化,只要做就有改变的可能,然后全力以赴去行动。
四、随着我们不断的觉察,不断的应用知道的知识做出行动,最后形成了习惯。不需要思考,大脑便自动自发的按新形成的模式去做,这就便进入了“不知道自己知道的”状态,形成了习惯成。比如,当我们已经习惯对他人欣赏认可时,“对”、“很好”会随时从嘴里冒出。我们学会开车后,在路上开车不会仔细考虑怎么加油门、刹车、打方向等,开车操作已经成了一种无意识运作。
我们认识新事物,学习新知识,就是不断的从无知到自知,再到觉察,最后形成习惯的过程。一个人首先让他觉察到自己的无知,才能走向自知,改变就有了可能。但从“知道”到“做到”也是一个相当难的过程,长期形成的模式很容易反复,需要不断的觉察、改变,持之以恒的坚持去做,才能逐渐形成习惯。
摘自 https://www.jianshu.com/p/ca8d65bf4094
Share 分享
https://blog.csdn.net/zhujianlin1990/article/details/60756448 zookeeper 因为hostname不匹配 导致的缓慢问题
https://www.zhihu.com/question/291554395 爬虫究竟是合法还是违法的?
https://www.jianshu.com/p/109fce1289e6 剑指offer最优解Java版-整数中1出现的次数(从1到n整数中1出现的次数)
https://www.jianshu.com/p/ca8d65bf4094 自我认识的四个阶段
https://blog.csdn.net/happyrocking/article/details/83619392 字典序算法详解