首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从数组中获取元素,其中下一个元素比前一个元素大1

从数组中获取元素,其中下一个元素比前一个元素大1
EN

Stack Overflow用户
提问于 2022-02-09 09:10:37
回答 2查看 402关注 0票数 0

我有一个数组:

代码语言:javascript
运行
复制
int[] arr = {-4, -2, -1, 0, 1, 3, 4, 5, 6, 9, 10, 12, 13, 14, 18};

数组按升序排列。其主要思想是获取元素并对它们进行分组,其中下一个元素比前一个元素大1。这些元素的最小长度应该等于3。

在输出中,我必须得到一个字符串:

代码语言:javascript
运行
复制
"-4, (-2-1), (3-6), 9, 10, (12-14), 18"

第一个间隔是:-2,-1,0,1-它应该看起来像范围i.e-2-1

下一个间隔是: 3,4,5,6-它应该看起来像范围,即3-6

9,10 -长度小于3

最后一个间隔是:

12,13,14它应该看起来像范围

EN

回答 2

Stack Overflow用户

发布于 2022-02-09 09:41:01

这个答案是预先编辑的。

您正在打印inputi,但您期待的是inputi -1中的值。

当您在调试器中运行它时,可以看到它找到-1 (它前面有-2,等于-2 + 1)。然后打印你找到的-1。

如果希望输出包含-2,则应打印inputi -1。

编辑后:

您已经按大括号对元素进行了分组,这意味着您正在寻找序列。这将要求您将起始号码保存在某个地方。您最初发布的代码(检查左边的简单循环)将需要更多的工作。

粗略地说:

代码语言:javascript
运行
复制
if (continuing a range) 
    if(this number is still in range / +1) continue
    else: stop the range and print it (start point plus current -1). if current -1 is the start point, don't use braces and range indicator. if it is different use braces and - between start and end)
else 
    start a range. (keep track of the number you are on and continue.

这就是你需要的伪码

票数 0
EN

Stack Overflow用户

发布于 2022-02-09 10:22:16

算法

你可以循环通过数组。

  1. 如果找到连续的数字,将其添加到组中(例如List)。
  2. 如果组满足最小长度(例如3),则将其添加到格式化为范围的输出(并清除组)。
  3. 如果没有连续的数字,只需将其添加到输出。

代码

代码语言:javascript
运行
复制
public static String formatAsRange(List<Integer> list) {
    return String.format("(%d-%d)", list.get(0), list.get(list.size()-1));
}

public static String consecutiveElements(int[] array, int minGroupLength) {
    StringBuilder sb = new StringBuilder();
    List<Integer> group = new ArrayList<>();
    for(int i = 0; i < array.length; i++) {
        if (i == 0 || array[i] == array[i-1] + 1) {
            group.add(array[i]);
        } else  {
            if (group.size() >= minGroupLength) {
                sb.append(formatAsRange(group)).append(',');                
            } else {
                var csv = group.stream().map(String::valueOf).collect(Collectors.joining(","));
                sb.append(csv).append(',');
            }
            group.clear();
            sb.append(array[i]).append(',');
        }
    }
    return sb.toString();
}

对于您的输入,它打印:-4,-2,(-1-1),3,(4-6),9,10,12,13,14,18,

基于IDEone的演示

去做

所以还是有什么要解决的。例如

  • 预期范围12-14丢失
  • 预期范围-2-1-2, (-1-1)不完整
  • 预期范围3-63, (4-6)不完整
  • 最后一个逗号可以移除。
  • 可以在每个逗号后面添加一个空格。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71046717

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档