爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法
import java.util.ArrayList;
import java.util.List;
/**
* 位图法
* 用于整型数组判重复,得到无重复列表
*
*/
public class Bit{
int max;
int min;
int[] arr;
public Bit(int[] arrInput){
// 找出极值
for(int i=0;i<arrInput.length;i++){
if(max<arrInput[i]){
max=arrInput[i];
}
if(min>arrInput[i]){
min=arrInput[i];
}
}
// 新建数组
arr=new int[max-min+1];
// 数组插值
for(int i:arrInput){
int index=i-min;
arr[index]++;
}
}
/**
* 判断有无元素重复
* @return
*/
public boolean hasDuplicateItem(){
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value>1){
return true;
}
}
return false;
}
/**
* 得到已排序的元素列表,有重复
* @return
*/
public List<Integer> getSortedList(){
List<Integer> ls=new ArrayList<Integer>();
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value!=0){
for(int j=0;j<value;j++){
ls.add(min+i);
}
}
}
return ls;
}
/**
* 得到已排序的元素列表,无重复
* @return
*/
public List<Integer> getUniqueSortedList(){
List<Integer> ls=new ArrayList<Integer>();
for(int i=0;i<arr.length;i++){
int value=arr[i];
if(value!=0){
ls.add(min+i);
}
}
return ls;
}
public static void main(String[] args){
int[] arr={-2,-1,3,5,7,9,30,4,-2,5,8,3};
Bit b=new Bit(arr);
System.out.print("排序后数组(有重复)为:");
for(int i:b.getSortedList()){
System.out.print(i+",");
}
System.out.println();
System.out.print("排序后数组(无重复)为:");
for(int i:b.getUniqueSortedList()){
System.out.print(i+",");
}
System.out.println();
String str=(b.hasDuplicateItem())?"有":"无";
System.out.println("数组arr"+str+"重复元素.");
int[] arr2={9,8,7,2};
str=(new Bit(arr2).hasDuplicateItem())?"有":"无";
System.out.println("数组arr2"+str+"重复元素.");
}
}
输出:
排序后数组(有重复)为:-2,-2,-1,3,3,4,5,5,7,8,9,30, 排序后数组(无重复)为:-2,-1,3,4,5,7,8,9,30, 数组arr有重复元素. 数组arr2无重复元素.
爪哇国新游记之二十二----排序判断重复时间复杂度为2n的位图法的更多相关文章
- 爪哇国新游记之二十九----访问URL获取输入流
代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...
- 爪哇国新游记之二十八----从url指定的地址下载文件到本地
package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...
- 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类
这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...
- 爪哇国新游记之三十四----Dom4j的XPath操作
Dom4j是Java访问XML的利器之一,另一个是JDom.记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一 ...
- 爪哇国新游记之十四----初试JDBC
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...
- 爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性
/** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; ...
- 爪哇国新游记之十三----XML文件读写
/** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...
- 爪哇国新游记之七----使用ArrayList统计水果出现次数
之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...
- 爪哇国新游记之一----第一个类Cube
将这个类作为Java学习的第一个类,简单易懂易上手. /** * 正方体类 */ public class Cube { private int length;// 正方体边长 private sta ...
随机推荐
- Storm中log4j日志打印不出来的解决办法
使用storm命令启动JAVA进程的时候,发现log4j日志打印不出来,咋办呢? 解决办法如下(亲测): 删除strom/lib目录下的log4j-over-slf4j-1.6.6.jar strom ...
- win上配置nginx
win上配置nginx 网上配置nginx的教程大多都是linux上的,今天贴出来nginx在win上的配置,在此篇配置中,nginx代理了Tomcat以及node服务.配置如下: 注意:根据实际经验 ...
- IIS-CS0016未能写入文件错误解决方法
使用IIS创建Workbench站点,运行在本地 Workbench主页显示错误,这个提示的错误信息其实是有误导人的,真的打开至c:\Windows\Microsoft.NET\Framework64 ...
- 【mysql】使数据表ID连续的两个方法
经常有一些完美主义者问我,怎么让数据库的自增字段在记录被删除时重置它们的顺序,这里不去讨论这么折腾是否真有必要,只说说解决方法,有这方面需求的朋友不妨看看. 方法1.删除自增字段,然后重建(缺点就是必 ...
- Python爬链接
# -*- coding: utf-8 -*- """ Created on Wed Jan 11 17:21:54 2017 @author: PE-Monitor & ...
- luogu P1038借教室【Noip提高组2012】
这道题我读完题目的第一感觉是: 这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断. 对于修改操作直接在区间上进行. 据说会卡一卡线段树,但是貌似写一个懒标记,连zkw线段树都不 ...
- 见微知著(三):解析ctf中的pwn--Fastbin和bins的溢出
1月1号写博客,也是不容易呀!大家新年快乐呀! 先从Fastbin看起,是2015年RCTF的一道pwn题,shaxian.先看看代码的大致流程,随便输入一下: 这个题目关键之处在于堆溢出,对于堆种类 ...
- 带WHERE子句的DELETE语句
由于前面我们执行“DELETE FROM T_Person”语句将数据表T_Person中的数据全部 删除了,为了演示带WHERE 子句的DELETE 语句,我们需要重新插入一些数据到T_Person ...
- 详细的KVO总结,包括基本改变,使用案例,注意点.看我就够了!
概述 KVO全称Key-Value-Observing,也叫键值监听,是一种观察者设计模式.提供了一种机制,当指定的对象的属性被修改后,对象就会收到一个通知.也就是说每次指定的被观察的对象的属性被修改 ...
- [BZOJ2125]最短路(圆方树DP)
题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...