【问题标题】:Find largest consecutive numbers in array and output numbers and how many there is查找数组中最大的连续数字和输出数字以及有多少
【发布时间】:2020-04-03 18:39:37
【问题描述】:

我下面的代码打印出有多少个连续数字。但是,我希望打印出有多少以及这些数字是多少。

例如 数组 = [1, 4, 9, 5, 2, 6]

这将输出:

连续数字的个数为:3

连续数字:[4 5 6]

public static int consecutive(int[] a)
    {
        HashSet<Integer> values = new HashSet<Integer>();
        for (int i :a)
        {
            values.add(i);
        }
        int max = 0;
        for (int i : values) {
            if (values.contains(i - 1))
            {
                continue;
            }
            int length = 0;
            while (values.contains(i++))
            {
                length++;
            }
            max = Math.max(max, length);
        }

        return max;
    }

【问题讨论】:

  • 到底是什么问题?
  • 可以复制吗? [3, 4, 4, 5] 中有多少个连续数?

标签: java arrays list


【解决方案1】:

按如下方式进行:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;

public class Main {
    public static void main(String[] args) {
        // Tests
        List<Integer> longestConsecutive;

        longestConsecutive = longestConsecutiveList(new int[] { 1, 4, 9, 5, 2, 6 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 2, 10, 4, 1, 5, 7, 3 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 5, 9, 7, 10, 11, 15, 12, 4, 6 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 10, 24, 20, 30, 23, 40, 25, 10, 2, 11, 3, 12 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 9, 7, 3, 8, 1 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 9 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 1, 2 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(new int[] { 1, 2, 3 });
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

        longestConsecutive = longestConsecutiveList(null);
        System.out.println(
                "Logest list of consecutive integers: " + longestConsecutive + ", Count: " + longestConsecutive.size());

    }

    public static List<Integer> longestConsecutiveList(int[] a) {
        if (a == null) {
            return new ArrayList<Integer>();
        }
        Set<Integer> values = new TreeSet<Integer>();
        List<Integer> list = new ArrayList<Integer>();
        List<Integer> tempList = new ArrayList<Integer>();
        int value = 0, temp = 0;

        // Add the elements of the array to the sorted set
        for (int i : a) {
            values.add(i);
        }

        // Create an iterator to navigate the sorted set
        Iterator<Integer> itr = values.iterator();

        // Get the first element from the sorted set, assign it to value and add it to
        // tempList. Since tempList has one element
        if (itr.hasNext()) {
            value = itr.next();
            tempList.add(value);
        }

        // Navigate the rest (2nd element onwards) of the sorted set
        while (itr.hasNext()) {
            // Get the next element from the sorted set and assign it to temp
            temp = itr.next();

            // If temp - value = 1, add temp to tempList
            if (temp - value == 1) {
                tempList.add(temp);
            } else if (tempList.size() >= list.size()) {
                list = tempList;
                tempList = new ArrayList<Integer>();
                tempList.add(temp);
            } else {
                tempList = new ArrayList<Integer>();
            }
            value = temp;
        }
        return list.size() > tempList.size() ? list : tempList;
    }
}

输出:

Logest list of consecutive integers: [4, 5, 6], Count: 3
Logest list of consecutive integers: [1, 2, 3, 4, 5], Count: 5
Logest list of consecutive integers: [9, 10, 11, 12], Count: 4
Logest list of consecutive integers: [10, 11, 12], Count: 3
Logest list of consecutive integers: [7, 8, 9], Count: 3
Logest list of consecutive integers: [9], Count: 1
Logest list of consecutive integers: [1, 2], Count: 2
Logest list of consecutive integers: [1, 2, 3], Count: 3
Logest list of consecutive integers: [], Count: 0

为了便于理解,我在代码中放了足够多的 cmets。如有任何疑问/问题,请随时发表评论。

【讨论】:

  • 当我输入不同范围的数字时,它有时会输出“null”。我的示例输入是“9、7、3、8、1”。知道这是为什么吗?
  • @pabs095 - 我已经解决了这个问题。如有任何疑问/问题,请随时发表评论。
  • 现在完美运行。谢谢。
  • 如果重复也应该计算在内,如何调整此解决方案?例如如果有 [1, 1, 2, 2]?
【解决方案2】:
private static int consecutive(int[] a) {
    Set<Integer> values;

    // to store the consecutive numbers
    List<Integer> nums = new ArrayList<>();

    values = Arrays.stream(a).boxed().collect(Collectors.toSet());

    int max = 0;
    for (int i : values) {
        if (values.contains(i - 1)) {
            continue;
        }

        // inner list for each sequemce
        List<Integer> temp = new ArrayList<>();

        // moved i++ inside the loop because the value is required to store
        while (values.contains(i)) {
            temp.add(i);
            i++;
        }

        // if the inner list is larger, replace
        if (nums.size() <= temp.size()) {
            nums = temp;
        }

        max = Math.max(max, temp.size());
    }

    System.out.println(nums);
    return max;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-13
    • 1970-01-01
    • 2018-11-19
    • 2011-12-18
    • 2015-07-27
    • 1970-01-01
    • 2023-03-14
    • 2017-06-27
    相关资源
    最近更新 更多