java - 使用Java检查序列是否几乎严格按升序排列
问题描述
这是我面试问题的一部分。
给定一个整数序列作为一个数组,我必须确定是否可以通过从数组中删除不超过一个元素来获得一个严格递增的序列。
例如,
对于
sequence = [1, 3, 2, 1]
,输出应该是
almostIncreasingSequence(sequence) = false
这个数组中没有一个元素可以被删除以获得一个>严格递增的序列。
对于序列=
[1, 3, 2]
输出应该是
almostIncreasingSequence(sequence) = true
我们可以从数组中删除 3 以获得严格递增的序列
[1, 2]
。或者,我们可以删除 2 以获得严格递增的序列[1, 3]
。如果可以从数组中删除一个元素以获得严格递增的序列,则该函数必须返回 true,否则返回
false
。
面试官想要的概念算法如下与Java:
boolean almostIncreasingSequence(int[] sequence) {
int seq1 = 0;
int seq2 = 0;
for(int i = 0; i < sequence.length - 1; i++){
if(sequence[i] >= sequence[i + 1]) seq1++;
}
for(int k = 0; k < sequence.length - 2; k++){
if(sequence[k] >= sequence[k + 2]) seq2++;
}
return !(seq1 + seq2 > 2);
}
但我没有得到sequence[i]
与sequence[i+1]
和进行比较的部分sequence[i+2]
来增加计数器seq1
和seq2
。这如何涵盖所有情况?
解决方案
这如何涵盖所有情况?
它不是。
这个算法是错误的。
考虑输入数组
{1,2,3,5,4,6,7,9,8}
它不是一个几乎严格递增的序列,因为您必须删除至少两个元素(例如,4 和 9)才能使其严格递增。
但是,您发布的代码将返回true
,因为seq1 + seq2 == 2
( seq1
is2
和seq2
is 0
)。
一个可能的解决方案:
- 遍历数组,比较每对相邻元素。
- 第一次找到不严格递增的对时(a[i] >= a[i+1]),您必须检查删除 a[i] 或 a[i+1] 是否会使数组严格递增.
- 如果删除 a[i],则必须确保 a[i-1] < a[i+1]。
- 如果删除 a[i+1],则必须确保 a[i] < a[i+2]。
- 如果此验证失败,则返回
false
.
- 否则,您将继续测试阵列的其余部分。
- 如果您发现另一对不严格增加,则返回 false。
- 否则你返回真。
推荐阅读
- python - 创建具有多项选择 Python 的票证
- recursion - 是否可以在 DFS 的递归求解问题中来回移动迭代器?
- java - 无法为 JRadioButton 创建和设置图标
- r - 如何在 R studio 中分配任何 Gb 的向量大小
- android - 如何在我的 android 应用程序中仅启用英文键盘?
- apache-spark - 原因:java.lang.Exception:您不能在 Spark 闭包中使用 GraphFrame 对象
- python - 如何在熊猫中复制和移动数据框
- c# - 在 Cosmos DB 中写入数据时如何拥有自己的分区键
- javascript - swift中的JavaScriptCore返回未定义
- javascript - 如何通过 web.config 更改 'url' 和 'src' 属性