假设有两个整型集合
A集合  元素
8    20     21     35     49      55
B集合  元素
4    19     23     37     40
每个集合中的元素都是从小到大排列
现在有一个数字,如5-35
要求删除A和B中出现在5-35中间的元素,包括5和35,之后A和B中大于35的每个元素减去31,
我想了个算法,感觉很繁琐,效率太低

解决方案 »

  1.   

    用Iterator迭代器完成啊,一次遍历,最多加几个判断
      

  2.   

    再穿件一个  数组c
    一个for循环 遍历  a   里面一个 if  进行数字加减 和过滤,合格就仍c里面  就完事了。
      

  3.   

    有点没表达清楚
    是一串数字,比如5-35
    下面是我的算法,感觉循环很多次,不知道有没好的算法           //A集合  8    20     21     35     49      55
        List<Integer> a=new ArrayList<Integer>();
        Collections.addAll(a, 8,20,21,35,49,55);
       //B集合  4    19     23     37     40
        List<Integer> b=new ArrayList<Integer>();
        Collections.addAll(b, 19,23,37,40);
        //假设数据范围为5-35
        for(int i=5;i<=35;i++){
         boolean isFinish=false;
         for(int ai=0,al=a.size();ai<al;ai++){
         if(a.get(ai)==i){
         a.remove(ai);
         ai--;
         al--;
         isFinish=true;
         break;
         }
         }
         if(!isFinish){
         for(int bi=0,bl=b.size();bi<bl;bi++){
         if(b.get(bi)==i){
         b.remove(bi);
         bi--;
         bl--;
         break;
         }
         }
         }
        }
        //将A B中大于35的元素减去31
        for(int i=0,j=a.size();i<j;i++){
         int num=a.get(i);
         if(num>35){
         a.remove(i);
         a.add(num-(36-5));
         i--;
         j--;
         }
        }
        for(int i=0,j=b.size();i<j;i++){
         int num=b.get(i);
         if(num>35){
         b.remove(i);
         b.add(num-(36-5));
         i--;
         j--;
         }
        }
        //输出A B
        for(int o : a){
         System.out.println("a:"+o);
        }
        for(int o : b){
         System.out.println("b:"+o);
        }
      

  4.   

    你是对5到35进行的遍历,这样还得遍历list集合,效率当然不高。算法复杂度是o2
    如果你想要的结果是删除list中5到35之间的数,你为什么不对list进行遍历,然后进行选取,这样复杂度是o1。
    for(Object o:a){
    if(Integer.parstInt("o")>=5&&Integer.parstInt("o")>=5)
    remove o;
    else{
    o=Integer.parstInt("o")-31;
    }
    }
    //没有编译环境,有可能代码会有问题。
      

  5.   

    可能我没表达清楚,我的操作是想
    将A集合并上B集合去与(A、B集合的元素不会有交集)5-35之前所有的数字求交集,然后取得A、B集合交集以外的所有数据
      

  6.   

    要是A 和B要合并的话   可以先用set 先合并  再过滤,set自动去重复,减少循环量再for,逻辑不复杂,基本for循环判断就行。判断事不用插入   直接remove  也行
      

  7.   

    不合并,只是为了说明,去掉A、B集合与5到35之间的数的交集,留下A、B两个集合剩余的数,A、B是两个集合
      

  8.   

    大体上给个思路,
    //A集合  8    20     21     35     49      55         
            List<Integer> a=new ArrayList<Integer>();         
            Collections.addAll(a, 8,20,21,35,49,55);        
            //B集合  4    19     23     37     40         
            List<Integer> b=new ArrayList<Integer>();         
            Collections.addAll(b, 19,23,37,40);   
            
            List<Integer> adelete = new ArrayList<Integer> ();
            List<Integer> bdelete = new ArrayList<Integer> ();
            
            //假设数据范围为5-35   
            for (int atmp : a) {
                if (atmp >= 5 && atmp <= 35) {
                    adelete.add(atmp);
                }
            }
            for (int btmp : b) {
                if (btmp >= 5 && btmp <= 35) {
                    bdelete.add(btmp);
                }
            }
            
            a.removeAll(adelete);
            b.removeAll(bdelete);
            
            //将A B中大于35的元素减去31         
            for(int i=0,j=a.size();i<j;i++){             
                int num=a.get(i);             
                if(num>35){                 
                    a.remove(i);                 
                    a.add(num-(36-5));                 
                    i--;                 
                    j--;             
                }         
            }         
            for(int i=0,j=b.size();i<j;i++){             
                int num=b.get(i);             
                if(num>35){                 
                    b.remove(i);                 
                    b.add(num-(36-5));                 
                    i--;                 
                    j--;             
                }         
            }         
            //输出A B         
            for(int o : a){             
                System.out.println("a:"+o);         
            }         
            for(int o : b){             
                System.out.println("b:"+o);         
            } 
        
      

  9.   

    总算看懂题目了。
    每个集合遍历一次即可。
    以A集合为例:
    只保留小于5或者大于35的元素,如果元素大于35则减去31.List<Integer> result = new List<Integer>();
    for (int n : a) {
        if(n < 5) result.add(n);
        else if(n > 35) result.add(n - 31);
    }
    a = result;集合B同理
      

  10.   


    var list = new List[Int](............)
    list.remove(i=>i<35&&i>5)
    list.map(i=>i-31)
      

  11.   

    判断在范围内的话,取出i,直接remove,再遍历打印啊
      

  12.   

    for(Object c:b){
    if(Integer.parstInt("o")>=5&&Integer.parstInt("c")>=3)
    remove o;
    else{
    o=Integer.parstInt("o")-21;
    print("http://www.fjjianen.com")
    }
    }