Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PHP Check if a number is in sequence but with one missing

Tags:

php

I can find if an array of values are in sequence using:

    sort($arr);
    if ($arr == range($arr[0], $arr[count($arr)-1])) {
      return true;
    }

So anything like 1,2,3,4,5, 6,7,8 will result in true but how can I find a number in sequence but with one number missing? So the expected output would be:

2,3,5,6 = true
2,5,6,8 = false
3,6,10,16 = false
5,7,8,9,10,11 = true
like image 232
Hasen Avatar asked Dec 14 '25 08:12

Hasen


2 Answers

I just checked this and it matches the outputs you expect from your original question

function skippedValue($arr) {
sort($arr);
return sizeof(array_diff(range($arr[0], $arr[count($arr)-1]), $arr)) == 1;
}

var_dump(skippedValue([2,3,5,6]));        // true
var_dump(skippedValue([2,5,6,8]));        // false
var_dump(skippedValue([3,6,10,16]));      // false
var_dump(skippedValue([5,7,8,9,10,11])); //true

result: bool(true) bool(false) bool(false) bool(true)

like image 96
imposterSyndrome Avatar answered Dec 15 '25 21:12

imposterSyndrome


Algorithmically rather verbose, but works:

function checkAlmostSequential(array $seq, $maxSkips = 1) {
    $skipped = 0;

    for ($i = 0, $num = $seq[0]; $i < count($seq); $num++) {
        if ($num == $seq[$i]) {
            $i++;
        } else {
            $skipped++;
        }

        if ($skipped > $maxSkips) {
            return false;
        }
    }

    return true;
}

var_dump(checkAlmostSequential([2,3,5,6]));        // true
var_dump(checkAlmostSequential([2,5,6,8]));        // false
var_dump(checkAlmostSequential([3,6,10,16]));      // false
var_dump(checkAlmostSequential([5,7,8,9,10,11]));  // true
like image 26
deceze Avatar answered Dec 15 '25 22:12

deceze