【问题标题】:Adding elements to a list将元素添加到列表
【发布时间】:2014-06-16 11:08:42
【问题描述】:

我有一些元素的列表。

List<Integer> list = new ArrayList<Integer>();

假设列表包含以下值:

0,0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4

如何在每个组之前添加一个虚拟元素(例如 -1)作为分隔符?他的结果应该是

-1,0,0,0,0,0,-1,1,1,1,1,-1,2,2,2,2,2,-1,3,3,3,3,3,3,3,3,-1,4,4,4,4,4,4,4

我如何有效地做到这一点?

【问题讨论】:

  • 您将要执行此请求的主要思想是什么,可能有替代和更好的解决方案
  • 我不认为你会比通过列表的蛮力迭代做得更好,原因很简单,你需要比较每对连续的元素。所以你永远不会比 O(n) 做得更好。
  • @BasselKh 可能有。但这只是我问题的一部分。列表排序后。我想对它进行分组,以便我可以将它用于解决方案。
  • 除非真的需要这样做(是作业吗?),否则根本不应该这样做。处理这种情况的典型方法是将值与它们的出现次数保持映射,如果您确实需要以这种方式打印它们,请遍历映射并随时构建输出。

标签: java arrays algorithm list


【解决方案1】:

使用Linked hash map,对数组进行for循环,将数字作为键,频率作为值。 根本不需要放置分隔符。

【讨论】:

    【解决方案2】:

    您只需要跟踪以前的值并遍历列表。

    List<Integer> origList = getListHowever();
    List<Integer> spacedList = new ArrayList<Integer>();
    int bufferElement = -1;
    int currVal;
    int lastVal = Integer.MIN_VALUE;  // or some default value that is unlikely to be in the list
    
    for (int i=0; i<origList.size(); i++) {
        currVal = origList.get(i);
        if (lastVal != currVal) {
            spacedList.add(bufferElement);
        }
        spacedList.add(currVal);
        lastVal = currVal;
    }
    

    在将项目添加到原始列表时,可以遵循相同的方法。跟踪最后添加的值或查看最后一个元素。

    【讨论】:

    • 请使用int curVal = origList.get(i); 并参考,您现在在每个循环中使用origList.get(i) 3 次。
    【解决方案3】:

    如果只需要知道每组元素的值和个数,可以使用两个数组。例如,如果您有 n 个不同的不同值(或 n 个组),您可以拥有一个数组 int[] valueint[]count,其中 value[i] 是第 i 个组的值,count[i] 是第第i组。

    所以在你的情况下:

    int [] value = new int[5];
    int [] count = new int[5];
    value[0] = 0;
    count[0] = 5;
    value[1] = 1;
    count[1] = 4;
    ......
    

    要从list 转换为valuecount,您只需要进行两次二分查找即可在list 中查找特定值的开始和结束索引(如果list 已排序) .所以时间复杂度将是 O(nlog m),其中 m 的大小为list

    正如 Zoyd 在他的评论中提到的,我们也可以使用 HashMap &lt;Integer,Integer&gt; 来存储元素对的值和数量,或者使用 TreeMap&lt;Integer, Integer&gt; 来维护它们的排序顺序。

    【讨论】:

      【解决方案4】:

      这是我的解决方案,以防重复整数被排序。

      排序的重复整数示例:

      0,0,0,1,1,1,2,2,3,3,3,3,4,4,4
      

      代码

      class FrequencyOrderedSet
      {
          LinkedHashMap<Integer,Integer> list;
      
          public FrequencySet()
          {
              list = new LinkedHashMap<Integer,Integer> ();
          }
      
          public void insert (Integer number)
          {
              if (list.constainsKey(number))
                  list.put(number, list.get(number)+1);
              else
                  list.put(number, 1);
          }
      
          public void remove (Integer number)
          {
              if (list.containsKey(number))
                  if (list.get(number) > 1)
                      list.put(number, list.get(number)-1);
                  else
                      list.remove(number);
          }
      
          public ArrayList getList ()
          {
              ArrayList out = new ArrayList<Integer> ();
      
              for (Integer num : list.getKeyList())
                  for (int i=0; i<list.get(num); i++)
                      out.add(num);
          }
      }
      

      【讨论】:

        【解决方案5】:

        编辑

        方法一:

        通过覆盖 add() 函数。

        List<Integer> list = new ArrayList<Integer>(){
            public boolean add(Integer add){
            if(super.size()==0 || super.get(super.size()-1)!=add)
                super.add(-1);
            super.add(add);
            return true;
            }
        };
        

        现在list.add(number); 将覆盖 add 函数并添加另一个整数(即-1),只要它发现最后一个元素的值发生变化。

        方法二

        以传统方式。找到更改时迭代并添加-1

        List<Integer> list = new ArrayList<Integer>();
                list.addAll(Arrays.asList(0,0,0,0,0,1,1,1,1,2,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4));  
                int last=-1;
                for(int i=0;i<list.size();i++){
                    if(list.get(i)!=last){
                        last=list.get(i);
                        list.add(i, -1);
                        ++i;
                    }
                }
        

        【讨论】:

          猜你喜欢
          • 2016-06-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-09
          相关资源
          最近更新 更多