日期:2014-05-20  浏览次数:20707 次

请各位大虾帮忙看看这个问题该如何解决?
检测一个集合中的元素是否是有序数字,并且最大的数字必须为这个集合的长度即(size) 请问该如何实现(高效的算法)~!
如:List list = new ArrayList();
  list.add("1");
  list.add("2");
  list.add("3");
  list.add("4");
  list.add("5");
这样是合法的,如出现 1,3,4,5,6 、1,2,2,3,4

------解决方案--------------------
一次遍历:
Java code

    public static boolean isLegal(List<Integer> list) {
        boolean ret = true;
        int last = -Integer.MAX_VALUE;
        if (list.get(list.size() - 1) <= list.size()) {
            for (int i = 0; i < list.size(); i++) {
                if (list.get(i) < last) {
                    ret = false;
                    break;
                }
                last = list.get(i);
            }
        } else {
            ret = false;
        }
        return ret;
    }

------解决方案--------------------
Java code

public boolean validata(List<Integer> list){
    Integer last = Integer.MAX_VALUE;
    int size = list.size();
    //如果最后一个不等于list的长度则直接返回false
    if(size != list.get(size)){
        return false;
    }
    for(int i = size - 1; i >= 0; i--){
        int value = list.get(i);
        //如果后面一个比前面一个小,则直接返回false
        if(last < value){
            return false;
        }
        last = value;
    }
    return true;
}

------解决方案--------------------
Java code

public class ArraySetDemo {

    public static void main(String[] args) {
        List<Integer> list = new ArrayList<Integer>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(check(list)); //true
        list.remove(2); //1 3 4 5
        System.out.println(check(list)); //false
        list.add(1); //1 1 3 4 5
        System.out.println(check(list)); //false
    }

    private static boolean check(List<Integer> list) {
        if (Collections.min(list)!=1) return false;
        if (Collections.max(list)!=list.size()) return false;
        Set<Integer> set = new HashSet<Integer>();
        for(Integer i: list) set.add(i);
        if (set.size()<list.size()) return false;
        return true;
    }

}

------解决方案--------------------
代码很干净,很简洁,还有一些细节可以改进,比如 ret的初始值设为false(这也是通常做法),这样后面可以省略几次赋值语句。-Integer.MAX_VALUE??

探讨

一次遍历:
Java code

public static boolean isLegal(List<Integer> list) {
boolean ret = true;
int last = -Integer.MAX_VALUE;
if (list.get(list.size() - 1) <= list.size()) {
……

------解决方案--------------------
一个方法里面有很多return不容易维护,个人不喜欢。

探讨

Java code

public boolean validata(List<Integer> list){
Integer last = Integer.MAX_VALUE;
int size = list.size();
//如果最后一个不等于list的长度则直接返回false
if(size != list.get(size)){
ret……

------解决方案--------------------
4楼可能在考虑性能优化,这样可以达到吗?
这个问题,如果List基数很大,几百亿,几千亿,可以考虑增加步长来提高效率。

探讨

Java code

public class ArraySetDemo {

public static void main(String[] args) {
List<Integer> list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add……

------解决方案--------------------
修改一下1L
Java code