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. TimeUnit 笔记

    TimeUnit笔记 1.TimeUnit 简介 TimeUnit是java.util.concurrent包下的一个枚举类,其主要封装了时间单位之间的转换以及基于时间上对线程的基本操作(sleep, ...

  2. python笔记-邮件发送(smtplib)【转载】

    本篇转自博客:上海-悠悠 原文地址:http://www.cnblogs.com/yoyoketang/tag/python/ 前言 本篇总结了QQ邮箱和163邮箱发送邮件,邮件包含html中文和附件 ...

  3. AC日记——Magazine Ad codeforces 803d

    803D - Magazine Ad 思路: 二分答案+贪心: 代码: #include <cstdio> #include <cstring> #include <io ...

  4. head first (一):策略模式

    head first 看了一遍,被面试时问我工厂模式,我发现我还是不记得,所以还是认认真真的看一遍吧,上一遍看的太快了,什么都没有记住.这一遍我会写下一些东西帮助自己记忆和理解,例子我也会用C#自己写 ...

  5. HDU 1014 Uniform Generator(最大公约数,周期循环)

    #include<iostream> #include <cstdio> #include <cstring> using namespace std; int m ...

  6. Python与数据结构[3] -> 树/Tree[2] -> AVL 平衡树和树旋转的 Python 实现

    AVL 平衡树和树旋转 目录 AVL平衡二叉树 树旋转 代码实现 1 AVL平衡二叉树 AVL(Adelson-Velskii & Landis)树是一种带有平衡条件的二叉树,一棵AVL树其实 ...

  7. DNS无响应

    无语,运行某某大品牌的杀毒软件后,无法上网,window检查后是DNS服务器无响应. 开始>运行>输入"netsh winsock reset"  然后重启电脑. pi ...

  8. Codeforces 786A Berzerk(博弈论)

    [题目链接] http://codeforces.com/problemset/problem/786/A [题目大意] 有两个人,每个人有一个数集,里面有一些数,现在有一个环,有个棋子放在1, 有个 ...

  9. [CodeChef-LVGFT]Lovers Gift

    题目大意: 给定一个$n(n\le10^5)$个结点的树,初始全为白点.$m(m\le10^5)$次操作,每次将点$x$染成黑色或询问从$x$出发至少经过一个黑点能到达的点中,编号次大的点. 思路: ...

  10. Problem E: 零起点学算法25——判断是否直角三角形

    #include<stdio.h> int main() { int a,b,c; while(scanf("%d %d %d",&a,&b,& ...