[228] 汇总区间

理解题意就好做了  ^ ^

题目:

给定一个  无重复元素 的 有序 整数数组 nums 。

返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说,nums 的每个元素都恰好被某个区间范围所覆盖,并且不存在属于某个范围但不属于 nums 的数字 x 。

列表中的每个区间范围 [a,b] 应该按如下格式输出:

  • "a->b" ,如果 a != b
  • "a" ,如果 a == b

红色字咋一看,没有看懂 ~,其实就是:

如果是一个区间,则区间的两头中间包含的所有数字都在nums中,包含边界

如果不是一个区间,只是一个数字 x,则这个数字在nums中,不存在 x - 1, 或 x + 1

 

/*
 * @lc app=leetcode.cn id=228 lang=java
 *
 * [228] 汇总区间
 */

// @lc code=start
class Solution {
    public List<String> summaryRanges(int[] nums) {
        List<String> ans = new ArrayList<>(nums.length);

        // 临时 buff
        StringBuilder buff = new StringBuilder();

        for(int i = 0; i < nums.length; ){
            // 当前区间的开始数字
            int startNum = nums[i];

            int j = 1;
            for(; j + i < nums.length; j++){
                // 不连续则直接跳出
                if(startNum + j != nums[j + i]){
                    break;
                }
            }

            // 区间开始数字
            buff.append(startNum);

            /**
             * 如果不存在连续数字,或则走到数组的尽头 j 都会 等于 1
             */
            if(j > 1){
                // 存在区间结束数字
                buff
                .append("->")
                .append(nums[i + j - 1]);
            }

            // 放入结果
            ans.add(buff.toString());

            // 清空buff
            buff.setLength(0);

            i += j;
        }

        return ans;
    }
}
// @lc code=end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值