首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2SE开发 >

请各位帮忙看看这个有关问题该怎么解决

2012-04-14 
请各位大虾帮忙看看这个问题该如何解决?检测一个集合中的元素是否是有序数字,并且最大的数字必须为这个集

请各位大虾帮忙看看这个问题该如何解决?
检测一个集合中的元素是否是有序数字,并且最大的数字必须为这个集合的长度即(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

    public static boolean isLegal(List<Integer> list) {        boolean ret = (list.get(list.size() - 1) == list.size());        if (ret) { //先判断最后位是否和size一样            for (int i = list.size()-1; i > 0; i--) {                if (list.get(i) <= list.get(i-1)) { //再判断相邻两位是否有序                    ret = false; //如果后一个位置的元素<=前一个位置的元素,则非有序                }            }        }        return ret;    }
[解决办法]
good
[解决办法]
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;
}

}


[解决办法]
探讨
检测一个集合中的元素是否是有序数字,并且最大的数字必须为这个集合的长度即(size) 请问该如何实现(高效的算法)~!
如:List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
这样是合法的,……

热点排行