数据结构与算法之字符凭拼接最低字典序和数据流中取中位数
数据结构与算法之字符凭拼接最低字典序和数据流中取中位数
目录
- 字符凭拼接最低字典序
- 数据流中取中位数
1. 字符凭拼接最低字典序
题目描述
思路:
- 创建一个比较器,比较的内容是
(o1+o2).compareTo(o2+o1)·
,返回的就是两者之和中字典顺序低的那一个。 - 在排序时应用比较器,将字符数组进行排序,然后依次组合即可。
- 创建一个比较器,比较的内容是
代码实现
import java.util.Arrays;
import java.util.Comparator;public class Code_05_LowestLexicography {public static class MyComparator implements Comparator<String> {@Overridepublic int compare(String a, String b) {return (a + b).compareTo(b + a);}}public static String lowestString(String[] strs) {if (strs == null || strs.length == 0) {return "";}Arrays.sort(strs, new MyComparator());String res = "";for (int i = 0; i < strs.length; i++) {res += strs[i];}return res;}public static void main(String[] args) {String[] strs1 = { "jibw", "ji", "jp", "bw", "jibw" };System.out.println(lowestString(strs1));String[] strs2 = { "ba", "b" };System.out.println(lowestString(strs2));}}
2. 数据流中取中位数
题目描述
思路
- 创建一个大根堆和小根堆,中位数就是两者堆顶元素中的一个,返回即可
- 具体思路见代码
代码实现
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;public class Code_04_MadianQuick {public static class MedianHolder {private PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new MaxHeapComparator());private PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(new MinHeapComparator());//调整大根堆和小根堆,两者之元素差=2时,弹出堆顶元素添加到另一个堆private void modifyTwoHeapsSize() {if (this.maxHeap.size() == this.minHeap.size() + 2) {this.minHeap.add(this.maxHeap.poll());}if (this.minHeap.size() == this.maxHeap.size() + 2) {this.maxHeap.add(this.minHeap.poll());}}//添加元素/*** 1. 如果大根堆为null,直接加到大根堆* 2. 如果大根堆堆顶元素大于添加元素,则添加到大根堆,否则进行else判断* 3. 如果小根堆为null,直接添加到小根堆* 4. 如果小根堆堆顶元素大于添加元素,添加元素添加到大根堆,否则加入小根堆* 5. 最后要调整大根堆和小根堆的状态*/public void addNumber(int num) {if (this.maxHeap.isEmpty()) {this.maxHeap.add(num);return;}if (this.maxHeap.peek() >= num) {this.maxHeap.add(num);} else {if (this.minHeap.isEmpty()) {this.minHeap.add(num);return;}if (this.minHeap.peek() > num) {this.maxHeap.add(num);} else {this.minHeap.add(num);}}modifyTwoHeapsSize();}//返回大根堆和小根堆之间的中位数public Integer getMedian() {int maxHeapSize = this.maxHeap.size();int minHeapSize = this.minHeap.size();if (maxHeapSize + minHeapSize == 0) {return null;}Integer maxHeapHead = this.maxHeap.peek();Integer minHeapHead = this.minHeap.peek();//表示如果两个size相同,返回true,所以中位数是两个堆顶元素和的一半。if (((maxHeapSize + minHeapSize) & 1) == 0) {return (maxHeapHead + minHeapHead) / 2;}return maxHeapSize > minHeapSize ? maxHeapHead : minHeapHead;}}public static class MaxHeapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {if (o2 > o1) {return 1;} else {return -1;}}}public static class MinHeapComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {if (o2 < o1) {return 1;} else {return -1;}}}// for testpublic static int[] getRandomArray(int maxLen, int maxValue) {int[] res = new int[(int) (Math.random() * maxLen) + 1];for (int i = 0; i != res.length; i++) {res[i] = (int) (Math.random() * maxValue);}return res;}// for test, this method is ineffective but absolutely rightpublic static int getMedianOfArray(int[] arr) {int[] newArr = Arrays.copyOf(arr, arr.length);Arrays.sort(newArr);int mid = (newArr.length - 1) / 2;if ((newArr.length & 1) == 0) {return (newArr[mid] + newArr[mid + 1]) / 2;} else {return newArr[mid];}}public static void printArray(int[] arr) {for (int i = 0; i != arr.length; i++) {System.out.print(arr[i] + " ");}System.out.println();}public static void main(String[] args) {boolean err = false;int testTimes = 200000;for (int i = 0; i != testTimes; i++) {int len = 30;int maxValue = 1000;int[] arr = getRandomArray(len, maxValue);MedianHolder medianHold = new MedianHolder();for (int j = 0; j != arr.length; j++) {medianHold.addNumber(arr[j]);}if (medianHold.getMedian() != getMedianOfArray(arr)) {err = true;printArray(arr);break;}}System.out.println(err ? "Oops..what a fuck!" : "today is a beautiful day^_^");}}
数据结构与算法之字符凭拼接最低字典序和数据流中取中位数相关推荐
- 数据结构与算法之“之”字型打印矩阵和矩阵中找数
数据结构与算法之"之"字型打印矩阵和矩阵中找数 目录 "之"字型打印矩阵 在行列都排好序的矩阵中找数 1. "之"字型打印矩阵 题目描述 思 ...
- 算法:数据流中的中位数
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 例如, [2 ...
- 【数据结构与算法】字符串匹配 BF算法 RK算法
单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 一.BF 算法 1,BF算法是Brute Force的缩写,中文译作暴力匹配算法,也 ...
- 拿命 3 天肝出来的计算机考研数据结构与算法复习笔记(超详细教程,更新中)
数据结构与算法 基本概述 数据结构指的是"一组数据的存储结构",算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. ...
- 【数据结构与算法】字符串匹配 AC自动机
单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 AC 自动机 AC 自动机实际上就是在 Trie 树之上,加了类似 KMP 的 ne ...
- 【数据结构与算法】字符串匹配 KMP 算法
单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 KMP 算法 KMP 算法是根据三位作者(D.E.Knuth,J.H.Morris ...
- 【数据结构与算法】字符串匹配 BM算法
单模式串匹配 BF 算法和 RK 算法 BM 算法和 KMP 算法 多模式串匹配算法 Trie 树和 AC 自动机 BM算法 BM算法的核心思想是通过将模式串沿着主串大踏步的向后滑动,从而大大减少比较 ...
- Java数据结构与算法(九)-程序员常用的10中算法
本章目录 第14章 程序员常用的10中算法 14.1 二分查找算法(非递归) 14.1.1 二分查找算法(非递归)介绍 14.2 分治算法 14.2.1 分治算法介绍 14.2.2 分治算法最佳实践- ...
- java数据结构与算法之平衡二叉树(AVL树)的设计与实现中的事实代码
普通二叉查找树的问题 在开篇,我们提到过,普通二叉树(二叉查找树)在操作的时间复杂度上不一定遵循O(㏒n),也有可能是O(n),这是为什么呢?在上一篇中,我们明明插入都按照一定规则比较的呀,其实那 ...
最新文章
- Nginx配置文件nginx.conf中文详解(转)
- redchat怎么编写shell脚本_shell脚本编写思路
- Codeforces Gym101257F:Islands II(求割点+思维)
- Python open()函数用法详解
- EXT2/EXT3/EXT4文件系统数据恢复工具开发计划
- ASP.Net 获取服务器信息
- iec61131 3 html5,IEC61131-3{ed3.0}标准资料.doc
- 在Centos7 更改Docker默认镜像和容器的位置
- bzoj 3670 [NOI2014]动物园
- asp.net 上传大文件控件
- MOOON-agent系统设计与使用说明
- mysql事务_MySQL事务提交过程(一)
- openstack安装文档
- android小程序题目,我要出题app-我要出题小程序预约 _5577安卓网
- 向前迈进!走入GC世界:G1 GC原理深入解析
- 不可不读的百句良言!!
- vncviewer退出全屏
- qcc 蓝牙耳机 TWS与TWS plus的区别
- SATA学习笔记 13 ---SATA NCQ
- Person owns Dog...
热门文章
- Linux x64 下 Matlab R2013a 300 kb 脚本文件调试的 CPU 占用过高问题的解决办法
- Mycat对于导入和扩容迁移性能压测
- 使用Struts 2框架实现文件下载
- hdu1160 dp
- 基于jquery的侧边栏分享导航
- 【Vegas原创】Mysql绿色版安装方法
- cron4j的Jfinal plugin
- CodeForces - 1369E DeadLee(贪心+拓扑)
- CodeForces - 1307C Cow and Message(思维)
- python左移位运算_python 移位运算符只能用于整型吗