830. 较大分组的位置『简单』

题目来源于力扣(LeetCode

一、题目

830. 较大分组的位置

题目相关标签:数组

说明:

  • 1 <= S.length <= 1000

二、解题思路

  1. 遍历字符串,判断当前元素与前一元素是否相同,相同时,记录次数的变量加 1

  2. 不同时,判断上一元素连续出现的次数是否大于等于 3,大于等于时,添加起始索引与结束索引至结果列表中

  3. 并将记录次数的变量重置为 1

遍历结束后,需要判断最后的 count 是否大于等于 3,因为最后一位元素也可能是连续出现次数大于等于 3 次的元素,而在循环中未进行添加的操作

三、代码实现

public static List<List<Integer>> largeGroupPositions(String S) {
    List<List<Integer>> ans = new ArrayList<>();
    // 空值判断与长度为 0 的判断
    if (S == null || S.length() < 1) {
        return ans;
    }
    char[] sarr = S.toCharArray();
    List<Integer> list = null;
    // 记录元素连续出现的次数
    int count = 1;

    for (int i = 1; i < sarr.length; i++) {
        if (sarr[i] == sarr[i - 1]) {
            count ++;
        } else {
            // 当前元素与前一元素不同时,对上一较大分组元素进行添加
            if (count > 2) {
                list = new ArrayList<>();
                list.add(i - count);
                list.add(i - 1);
                ans.add(list);
            }
            count = 1;
        }
    }
    // 最后一位也是较大分组中的元素时的情况
    if (count > 2) {
        list = new ArrayList<>();
        list.add(sarr.length - count);
        list.add(sarr.length - 1);
        ans.add(list);
    }
    return ans;
}

四、执行用时

五、部分测试用例

public static void main(String[] args) {
    String str = "abbxxxxzzy";  // output: {{3, 6}}
//    String str = "abc";  // output: {}
//    String str = "abcdddeeeeaabbbcd";  // output: {{3, 5}, {6, 9}, {12, 14}}

    List<List<Integer>> result = largeGroupPositions(str);
    System.out.println(result);
}
posted @ 2020-07-02 22:07  知音12138  阅读(44)  评论(0编辑  收藏