ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2021-08-01 18:02:24  阅读:212  来源: 互联网

标签:Java java int new 题查 add 补缺 resList now


 

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,java,int,new,题查,add,补缺,resList,now
来源: https://blog.csdn.net/xinkuaile/article/details/119301126

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有