Java教程

【Java】通过一个算法题查漏补缺

本文主要是介绍【Java】通过一个算法题查漏补缺,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

 

1.问题是什么

   算法题:https://leetcode-cn.com/problems/merge-intervals/

在用Java实现时,遇到了好多的问题。

 第一版的Java代码如下:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;

/*
 * @lc app=leetcode.cn id=56 lang=java
 *
 * [56] 合并区间
 */

// @lc code=start
class Solution {
    public int[][] merge(int[][] intervals) {
        return doMerge(intervals);
    }

    public int[][] doMerge(int[][] intervals) {
        Arrays.sort(intervals, new Comparator<int[]>(){
            @Override
            public int compare(int[] m, int[] n){
                return m[0] - n[0];
            }
        });
        List<List<Integer>> resList = new ArrayList<>();
        List<Integer> hasMergeIndex = new ArrayList<>();

        boolean isNeedAddNow = false;
        for (int i = 0; i < intervals.length; i++) {
            if(hasMergeIndex.contains(i)){
                continue;
            }
           int[] now = intervals[i]; 
           if(i == 0){
               List<Integer> nowList = new ArrayList<>();
               nowList.add(now[0]);
               nowList.add(now[1]);
               resList.add(nowList);
           }
           for(List<Integer> itemList : resList) {

              // 更新右边界
              if(now[0] <= itemList.get(1) 
              && now[0] >= itemList.get(0)) {
                  itemList.set(1, Math.max(now[1], itemList.get(1))) ;
                  hasMergeIndex.add(i);
              }
              // 更新左边界
              else if(now[1] <= itemList.get(1) 
              && now[1] >= itemList.get(0)) {
                  itemList.set(0, Math.min(now[0], itemList.get(0))) ;
                  hasMergeIndex.add(i);
              }
              else{
                  isNeedAddNow = true;
              }
           }

           if(isNeedAddNow){
                List<Integer> nowList = new ArrayList<>();
                nowList.add(now[0]);
                nowList.add(now[1]);
                resList.add(nowList);
                  hasMergeIndex.add(i);
           }
        }

        int[][] resMerge = new int[resList.size()][2];
        int j = 0;
        for(List<Integer> itemInt : resList){
            resMerge[j][0] = itemInt.get(0);
            resMerge[j][1] = itemInt.get(1);
            j++;
        }
        return resMerge;
    }
}
// @lc code=end

   主要的问题和解决方案:

    1) list的修改值怎么处理, list.set(1, newValue);
    2) 初始化一个 二维数组 int[][] resMerge = new int[][];  
      答: resMerge = resList.toArray(new int[resList.size()][2]);

    3)遇到了异常:
     Line 28: java.util.ConcurrentModificationException
     答: 不要在迭代list的时候,同时进行修改操作,否则用其他的方法

     4)
     Line 56: java.lang.ArrayStoreException: arraycopy: element type mismatch: can not cast one of the elements of java.lang.Object[] to the type of the destination array, [I


     [[2,3],[2,2],[3,3],[1,3],[5,7],[2,2],[4,6]]

     5) 数组也可能发生 NPE, 当初始化二维数组时,不指定第2维度的大小时,就可能发生
     int[][] resMerge = new int[resList.size()][2];

这篇关于【Java】通过一个算法题查漏补缺的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!