我正在尝试编写代码,通过从该数组中仅删除一个元素来确定是否有可能获得严格增加整数的数组。
我的代码可以处理17种情况中的16种,但是无法想到一种巧妙地重写代码的方法,因此它可以解决一个数字大于或小于该数字的情况。我已经写了这个for循环。这是我的代码。这种情况不适用于数组:[1、2、3、4、3、6],因为它不认为数组中的后3个是当前构造for循环的违法者。
boolean almostIncreasingSequence(int[] sequence) {
int offenderPosition = 0;
int[] arrCopy = Arrays.copyOf(sequence, sequence.length);
boolean ordered = true;
//trying to neatly rewrite this for loop
for(int i= 0; i < sequence.length; i++){
if(i<sequence.length-1){
for(int j = i+1; j < sequence.length; j++) {
if(!(sequence[i] < sequence[j])){
ordered = false;
offenderPosition = i;
}
}
}
if(i == sequence.length-1){
if(!(sequence[i] > sequence[i-1])){
ordered = false;
offenderPosition = i;
}
}
}
if(ordered == false) {
//remove offender
int currentSize = arrCopy.length;
for(int i = offenderPosition+1;i< currentSize; i++) {
arrCopy[i-1] = arrCopy[i];
}
currentSize--;
//reassign array
arrCopy = Arrays.copyOf(arrCopy, currentSize);
boolean lastChance = true;
for(int i = 0; i < currentSize-1; i++){
for(int j = i+1; j < currentSize; j++) {
if(!(arrCopy[i] < arrCopy[j])){
lastChance = false;
}
}
}
return lastChance;
}
else{
return true;
}
}
最佳答案
我认为这可能有效:
boolean almostIncreasingSequence(int[] a) {
int count1 = 0 , count2 = 0;
for(int i = 0 ; i < a.length-1 ; i++){
if(a[i] >= a[i+1]) count1++;
}
for(int i = 0 ; i < a.length-2 ; i++){
if(a[i] >= a[i+2]) count2++;
}
return (count1 <=1) && (count2 <= 1);
}
第一个循环仅检查彼此靠近的数字。如果第一个索引大于第二个索引,我们将为count1加1。当将1加到count1时,这意味着该方法应返回false的第一个索引大于第二个索引;第二个for循环还将检查ex。如果第一个索引大于第三个索引。 1、2、1,2例如,它将向count2加1。每次执行循环时,该方法将返回if语句返回的布尔值。