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的位图法的更多相关文章

  1. 爪哇国新游记之二十九----访问URL获取输入流

    代码: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileWriter; import ...

  2. 爪哇国新游记之二十八----从url指定的地址下载文件到本地

    package download; import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; ...

  3. 爪哇国新游记之二----用于计算三角形面积的Point类和TAngle类

    这次尝试用两个类完成一个面积计算任务: Point类代表平面上的点: public class Point { private float x; private float y; public Poi ...

  4. 爪哇国新游记之三十四----Dom4j的XPath操作

    Dom4j是Java访问XML的利器之一,另一个是JDom.记得当年因为粗掌握点JDomAPI但项目要求使用Dom4j还闹一阵情绪,现在看来真是没必要,只花一些时间成本就进去一个新世界绝对是值得做的一 ...

  5. 爪哇国新游记之十四----初试JDBC

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import ...

  6. 爪哇国新游记之十九----使用Stack检查数字表达式中括号的匹配性

    /** * 辅助类 * 用于记载字符和位置 * */ class CharPos{ char c; int pos; public CharPos(char c,int pos){ this.c=c; ...

  7. 爪哇国新游记之十三----XML文件读写

    /** * XML读写示例 * @author hx * */ public class XmlReaderWriter{ /** * 读取一个XML文件,返回一个雇员链表 * @param file ...

  8. 爪哇国新游记之七----使用ArrayList统计水果出现次数

    之前学习制作了DArray,了解ArrayList就容易了. /** * 用于存储水果名及数量 * */ public class Fruit{ private String name; public ...

  9. 爪哇国新游记之一----第一个类Cube

    将这个类作为Java学习的第一个类,简单易懂易上手. /** * 正方体类 */ public class Cube { private int length;// 正方体边长 private sta ...

随机推荐

  1. Storm中log4j日志打印不出来的解决办法

    使用storm命令启动JAVA进程的时候,发现log4j日志打印不出来,咋办呢? 解决办法如下(亲测): 删除strom/lib目录下的log4j-over-slf4j-1.6.6.jar strom ...

  2. win上配置nginx

    win上配置nginx 网上配置nginx的教程大多都是linux上的,今天贴出来nginx在win上的配置,在此篇配置中,nginx代理了Tomcat以及node服务.配置如下: 注意:根据实际经验 ...

  3. IIS-CS0016未能写入文件错误解决方法

    使用IIS创建Workbench站点,运行在本地 Workbench主页显示错误,这个提示的错误信息其实是有误导人的,真的打开至c:\Windows\Microsoft.NET\Framework64 ...

  4. 【mysql】使数据表ID连续的两个方法

    经常有一些完美主义者问我,怎么让数据库的自增字段在记录被删除时重置它们的顺序,这里不去讨论这么折腾是否真有必要,只说说解决方法,有这方面需求的朋友不妨看看. 方法1.删除自增字段,然后重建(缺点就是必 ...

  5. Python爬链接

    # -*- coding: utf-8 -*- """ Created on Wed Jan 11 17:21:54 2017 @author: PE-Monitor & ...

  6. luogu P1038借教室【Noip提高组2012】

    这道题我读完题目的第一感觉是: 这不就是个线段树??用线段树维护区间最小值,检查是否满足订单要求即可判断. 对于修改操作直接在区间上进行. 据说会卡一卡线段树,但是貌似写一个懒标记,连zkw线段树都不 ...

  7. 见微知著(三):解析ctf中的pwn--Fastbin和bins的溢出

    1月1号写博客,也是不容易呀!大家新年快乐呀! 先从Fastbin看起,是2015年RCTF的一道pwn题,shaxian.先看看代码的大致流程,随便输入一下: 这个题目关键之处在于堆溢出,对于堆种类 ...

  8. 带WHERE子句的DELETE语句

    由于前面我们执行“DELETE FROM T_Person”语句将数据表T_Person中的数据全部 删除了,为了演示带WHERE 子句的DELETE 语句,我们需要重新插入一些数据到T_Person ...

  9. 详细的KVO总结,包括基本改变,使用案例,注意点.看我就够了!

    概述 KVO全称Key-Value-Observing,也叫键值监听,是一种观察者设计模式.提供了一种机制,当指定的对象的属性被修改后,对象就会收到一个通知.也就是说每次指定的被观察的对象的属性被修改 ...

  10. [BZOJ2125]最短路(圆方树DP)

    题意:仙人掌图最短路. 算法:圆方树DP,$O(n\log n+Q\log n)$ 首先建出仙人掌圆方树(与点双圆方树的区别在于直接连割边,也就是存在圆圆边),然后考虑点u-v的最短路径,显然就是:在 ...