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. sphinx-python文档化

    概述 下文讲述使用sphinx自动生成reStructuredText python API文档的简单过程. 配置流程 安装依赖 $ pip install sphinx blurb python-d ...

  2. 子类构造函数 supper关键字

    在导出类的构造函数,如果没有明确指定调用哪一个基类构造器,它会默默调用默认构造器. 如果不存在默认构造器,编译器就会报错. java编程思想 p158(p194)

  3. docker从零开始(三)服务初体验docker compose

    决条件 安装Docker 1.13或更高版本. 获取Docker Compose.在适用于Mac的Docker和适用于Windows的Docker上,它已预先安装,因此您可以随意使用.在Linux系统 ...

  4. Mysql中大表添加索引的办法

    Hash索引与 Btree索引的区别http://database.51cto.com/art/201010/229525.htm Creating Indexes/Sorting on very l ...

  5. .NET Core on Raspberry Pi

    原文地址:传送门 .NET Core on Raspberry Pi Arm32 builds are available as community supported builds for .NET ...

  6. hdu6231

    hdu6231 题意 给出一些数字,对于任意长度不小于 \(k\) 的区间,把第 \(k\) 大数加入到一个新的数组 \(B\) 中,求 \(B\) 数组第 \(m\) 大数. 分析 二分答案 \(x ...

  7. KMP+差分 文章过滤器 (filter)

    Description 给定一些短串,要求你在一个长串中,将这些短串部分变为\(*\) Input 第一行包括一个整数\(n\),表示短串的数量. 接下来的\(n\)行,为\(n\)个短串. 最后一行 ...

  8. 表(Table)

    虽然我们已经将不同用途的物品保存在不同的仓库中了,但是在同一个仓库中数据的保存仍然存在问题.比如食品分为熟食.生肉.大米等,如果把他们随意的堆放在一起,就会造成我们无法很容易的对这些食品进行管理,当要 ...

  9. 【AC自动机】hdu2222 Keywords Search

    AC自动机模板题,给你n个模式串和一个文本串,问你有几个模式串在文本串出现过. 注意防止重复统计 这里推荐一波郭大爷的介绍,简单易懂. http://www.bilibili.com/video/av ...

  10. [AGC012F]Prefix Median

    题目大意: 给定一个长度为$2n-1(n\le50)$的数组$a$,可以重排$a$中的元素,生成一个长度为$n$的数组$b$,其中$b_i$为$a_1\sim a_{2i-1}$的中位数.求对于给定的 ...