暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

java的treemap使用

测试备忘录 2021-11-04
711

一、简介    

    TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。


二、实用方法

    除了以上的介绍和常用的map方法之外,treemap还提供了比较实用的几个方法,对一些问题的处理会方便很多。

1)ceilingKey()

    参数
    key-- 此要匹配的键。


    返回值
    如果不存在这样的键在方法调用返回的最小键大于或等于键,则返回null

    2)floorKey()

      参数
      key-- 这是要匹配的键。


      返回值
      方法调用返回的最大键小于等于key,或者null,如果不存在这样的键。


      三、示例

        给你一个长桌子,桌子上盘子和蜡烛排成一列。给你一个下标从 0 开始的字符串 s ,
        它只包含字符 '*' 和 '|' ,其中 '*' 表示一个 盘子 ,'|' 表示一支 蜡烛 。


        同时给你一个下标从 0 开始的二维整数数组 queries ,其中 queries[i] = [lefti, righti] 表示 子字符串 s[lefti...righti] (包含左右端点的字符)。
        对于每个查询,你需要找到 子字符串中 在 两支蜡烛之间 的盘子的 数目 。如果一个盘子在 子字符串中 左边和右边 都 至少有一支蜡烛,那么这个盘子满足在 两支蜡烛之间 。


        比方说,s = "||**||**|*" ,查询 [3, 8] ,表示的是子字符串 "*||**|" 。
        子字符串中在两支蜡烛之间的盘子数目为 2 ,子字符串中右边两个盘子在它们左边和右边 都 至少有一支蜡烛。
        请你返回一个整数数组 answer ,其中 answer[i] 是第 i 个查询的答案。


        示例:
        输入:s = "**|**|***|", queries = [[2,5],[5,9]]
        输出:[2,3]
        解释:
        - queries[0] 有两个盘子在蜡烛之间。
        - queries[1] 有三个盘子在蜡烛之间。

        解答:

          class Solution {
          public int[] platesBetweenCandles(String s, int[][] queries) {
          int[] result = new int[queries.length];
          int[] r1 = new int[s.length()];
          TreeMap<Integer, Integer> map = new TreeMap<>();
          int flag = 0;
          int temp = 0;
          int pos = 0;
                  // 获取每个蜡烛前面,在蜡烛之前的盘子数,之后任意两个位置之间的盘子数,
                  // 便可以转换为离这两个位置最近的两个蜡烛负责的盘子数之差。
                  // 蜡烛位置为query数组中位置的子区间。
          for(int i=0;i<s.length();i++){
          if(s.charAt(i)-'|'==0){
          if(flag==0){
          r1[i]=0;
          flag++;
          pos = i;
          map.put(pos,0);
          }else{
          int t0 = pos;
          pos = i;
          r1[pos]+=r1[t0];
          r1[pos]+=temp;
          temp=0;
          map.put(pos,r1[pos]);
                          }                
          }
          if(s.charAt(i)-'*'==0&&flag>0){
          temp++;
          }
          }
                  for(int i=0;i<queries.length;i++){
                   // ceilingKey获取大于等于当前位置的最近蜡烛
          Integer start = map.ceilingKey(queries[i][0]);
          // floorKey获取小于等于当前位置的最近蜡烛
                      Integer end = map.floorKey(queries[i][1]);
          if(start>end){
          result[i]=0;
          }else{
          result[i]=r1[end]-r1[start];
                      }           
                  }       
          return result;
          }
          }
          文章转载自测试备忘录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

          评论