我有一个数组:
int[] arr = {-4, -2, -1, 0, 1, 3, 4, 5, 6, 9, 10, 12, 13, 14, 18};数组按升序排列。其主要思想是获取元素并对它们进行分组,其中下一个元素比前一个元素大1。这些元素的最小长度应该等于3。
在输出中,我必须得到一个字符串:
"-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它应该看起来像范围
发布于 2022-02-09 09:41:01
这个答案是预先编辑的。
您正在打印inputi,但您期待的是inputi -1中的值。
当您在调试器中运行它时,可以看到它找到-1 (它前面有-2,等于-2 + 1)。然后打印你找到的-1。
如果希望输出包含-2,则应打印inputi -1。
编辑后:
您已经按大括号对元素进行了分组,这意味着您正在寻找序列。这将要求您将起始号码保存在某个地方。您最初发布的代码(检查左边的简单循环)将需要更多的工作。
粗略地说:
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.这就是你需要的伪码
发布于 2022-02-09 10:22:16
算法
你可以循环通过数组。
List)。3),则将其添加到格式化为范围的输出(并清除组)。代码
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,
去做
所以还是有什么要解决的。例如
12-14丢失-2-1与-2, (-1-1)不完整3-6与3, (4-6)不完整https://stackoverflow.com/questions/71046717
复制相似问题