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. [ Python - 5 ] 通过random模块生成随机字符串

    import random checkcode = '' for i in range(4): if i == random.randint(0,3): current = chr(random.ra ...

  2. fullpage.js jq全屏滚动插件

    fullPage.js和fullPage都能实现全屏滚动,二者区别是:fullPage.js需依赖于JQuery库,而fullPage不需要依赖任何一个js库,可以单独使用. (代码演示效果并且可以下 ...

  3. docker run 的背后的故事(zz)

    当利用docker run来创建并启动容器的时候,docker后台标准的操作包括: 1.检查本地是否存在指定的镜像,不存在就从公有仓库下载. 当我依瓢画葫芦的运行: sudo docker run - ...

  4. opencv inrange 和 mix

    opencv inrange: http://blog.csdn.net/xiaoyufei117122/article/details/53572904 http://blog.csdn.net/w ...

  5. mkdir 创建目录

    短选项 长选项 含义 -m <目录属性> --mode <目录属性> 建立目录时同时设置目录的权限. -p --parents 此选项后,可以是一个路径名称.若路径中的某些目录 ...

  6. Linux下Tomcat安装配置

    买了台阿里云服务器,因为配置比较低,所以用Linux系统,这里记录一下我在Linux系统中Tomcat的安装配置. 前提JDK已经安装好. 安装 首先在/usr/local/下建立一个tomcat的文 ...

  7. 【转】python 生成器和迭代器有这篇就够了

    总结得特别好,转自:https://www.cnblogs.com/wj-1314/p/8490822.html 本节主要记录一下列表生成式,生成器和迭代器的知识点 列表生成器 首先举个例子 现在有个 ...

  8. 详解jQuery的选择器

    1.基本选择器 基本选择器是jQuery中最常用的选择器,也是最简单的选择器,它通过元素id.class和标签名等来查找DOM对象.在网页中,每个id名称只能使用一次,class允许重复使用. ♠ # ...

  9. [BZOJ 3571] 画框

    Link: BZOJ 3571 传送门 Solution: 和 BZOJ2395 的建模完全相同,(BZOJ2395 题解传送门) 仅仅是将其中的基础问题由最小生成树改成了二分图最大完美匹配 只要将原 ...

  10. 【函数式权值分块】【分块】bzoj1901 Zju2112 Dynamic Rankings

    论某O(n*sqrt(n))的带修改区间k大值算法. 首先对序列分块,分成sqrt(n)块. 然后对权值分块,共维护sqrt(n)个权值分块,对于权值分块T[i],存储了序列分块的前i块的权值情况. ...