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. 如何生成pyc/pyo/pyd文件

    # 一.如何生成pyc/pyo文件 # 1.通过编写代码生成 import py_compile # 参数如下 ''' def compile(file, cfile=None, dfile=None ...

  2. python的class的__str__和__repr__(转)

    本文参考自: https://stackoverflow.com/questions/18393701/the-difference-between-str-and-repr?noredirect=1 ...

  3. ASP.NET MVC中DropDownList的使用

    Asp.net MVC中的DropDownLists貌似会让一开始从Asp.net Forms转过来的程序员造成不少迷惑.这篇文章讲述了为了使用DropDownLists,你需要在Asp.Net MV ...

  4. JS—正则表达式

    正则表达式的元字符是包含特殊含义的字符,它们有一些特殊的功能,可以控制匹配模式的方式,反斜杠后的元字符失去其特殊含义. 单个字符和数字 .表示匹配除换行符外的单个字符,两个.就表示匹配两个字符 var ...

  5. [xampp] phpmyadmin 设置登录密码

    $ cd /opt/lampp/bin $ ./mysqladmin -u root password 'new_password' $ vim ../phpmyadmin/config.inc.ph ...

  6. HDU 1754.I Hate It-结构体版线段树(单点更新+区间查询最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  7. ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛

    编号 名称 通过率 通过人数 提交人数 A√水题(队友写的 Visiting Peking University 91% 1122 1228 B— Reverse Suffix Array 57% 6 ...

  8. 训练指南 UVA - 10917(最短路Dijkstra + 基础DP)

    layout: post title: 训练指南 UVA - 10917(最短路Dijkstra + 基础DP) author: "luowentaoaa" catalog: tr ...

  9. hdu2665(主席树模板题)

    hdu2665 题意 求区间第 k 小. 分析 参考 这类题目做法挺多的,例如 划分树. 这里使用主席树再写一发,不得不说主席树相比而言要好写的多,比起普通线段树,主席树就是复用了线段树共有的信息. ...

  10. Typora

    Typora BB in front 如果你是一个佛(lan)系(duo),内心文艺的程序员,并且你对其他Markdown编辑器的使用效果感觉不是很好的话,可以来了解一下该软件Typora. What ...