ARTS (第5周)
开篇词
这周做的算法题和看的专栏,使我收获了几个东西:
1、并不是一定更多重循环就比更少重循环的执行效率差,比如,希尔排序是插入排序的优化,插入排序比较标准的写法是双重循环,而希尔排序是三重循环,但是为什么能希尔排序反而是插入排序的优化呢?因为执行次数,希尔排序的执行次数并不会比插入排序多。而交换次数更少。
2、代码长短并不是最重要的,短的代码固然看起来舒服,但是如果写的长而效果更好,那就应该写长点。
本周:
各类经典排序、思路独特的排序
Algorithm 算法
线性排序
桶排序
核心思想就是根据数据大小 将数据桶分为几个若干的桶,并且每个桶之间都有大小关系。分完之后,再每个桶进行排序,最后将每个桶的东西全部汇集到一起。
比如我这里的写了3种,分别是用list和数组做的,
我这里是按照位数进行分桶,1位数一个桶,2位数1个桶,以此类推。
计数排序
当数组里有N个数,数组里最大值为M的时候,就将数据分为M个桶。
然后进行counter[i] = counter[i] + counter[i - 1]的操作,这样的话,桶的下标就是对应的数值,而桶里的值就是这个数值,所应该在的位置,但有重复数值的时候需要一些特别的处理,具体可以看代码,注释齐全。
基数排序
与桶排序的思想有些类似,也是将数据分为多个桶,比如10个桶,每个1位数的数字就代表了每一个桶。然后从个位开始排序,排序完了,排第十位数,以次类推。
独特的排序
这些独特的排序,效率可能不是很好,但思路比较独特,所以我也试着写了写。
分别是:猴子排序,睡排序。
PS:睡眠排序的效率,以现在的语言来说,怎么看效果都很差,但我在网络上看到的一个说法,就是这种排序方式如果能用相匹配的硬件支持,效果将会极佳。甚至可以依照这种算法,专门设计出一种硬件来进行排序。但我对硬件的运行机制 不是很了解,这里不做评价
排序代码
1 | package jdk8test; |
LeetoCode
整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
https://leetcode-cn.com/problems/reverse-integer/
这里我做了2种方式,一个是转字符串的,一个是用long计算的方式。
1 | public static int reverse2(int x) { |
回文数
数字是否回文串
https://leetcode-cn.com/problems/palindrome-number/comments/
如果用转字符串的计算的话,会很简单,取出首尾进行判断就行了,但题目说希望用数字的方式进行。想到之前做的那题数值回转的题,刚好思路可以用到这里来,将数字进行一下反转,就可以得到反转后的数值,匹配一下是否相等,就可以得到结果了。
1 | /** |
罗马数字转整数
https://leetcode-cn.com/problems/roman-to-integer/
这题就是要求将罗马数字转换为整数.
因为我对于罗马数字的了解不足,这是我做的第一个答案,提交后,效率竟然达到了超越99%的人,这个时候我是有点不信的,后来我去看了各种提交的答案,看到很多答案里,用了很多字符串处理的api 等,这些字符串的处理里,循环是少不了的。也应该是因此,我这个答案的循环次数极少,所以才会有比较高的排名。
对此,在结合之前看过的希尔排序,我感觉到了1个结论
1、并不是一定更多重循环就比更少重循环的执行效率差,比如,希尔排序是插入排序的优化,插入排序比较标准的写法是双重循环,而希尔排序是三重循环,但是为什么能希尔排序反而是插入排序的优化呢?因为执行次数,希尔排序的执行次数并不会比插入排序多。而交换次数更少。
2、代码长短并不是最重要的,短的代码固然看起来舒服,但是如果写的长而效果更好,那就应该写长点。
1 | public static int romanToInt1(String s) { |
然后我看到了第一名的做法,很精巧的一个答案
利用下标进行取数判断,最后得出值。
1 | private final int[] symbols = new int[]{ |
Review 英文文章
这篇文章简单的介绍了hbase的使用。
Tip 技巧
极客时间的专栏《数据结构与算法之美》
本周学习了该专栏中的13-14篇
学习了排序优化和线性排序算法。
出处:《数据结构与算法之美》(作者:王争)
https://time.geekbang.org/column/intro/126
Share 分享
本周的分享也是我的开篇词
1、并不是一定更多重循环就比更少重循环的执行效率差,比如,希尔排序是插入排序的优化,插入排序比较标准的写法是双重循环,而希尔排序是三重循环,但是为什么能希尔排序反而是插入排序的优化呢?因为执行次数,希尔排序的执行次数并不会比插入排序多。而交换次数更少。
2、代码长短并不是最重要的,短的代码固然看起来舒服,但是如果写的长而效果更好,那就应该写长点。