PHP найти пузырь в массиве чисел

Я разработал рекурсивное решение ниже. Функция возвращает одну букву, а затем вызывает себя, чтобы вернуть следующую букву. Он делает это до тех пор, пока число, переданное функции, не будет 0, что означает, что все буквы найдены, и мы можем выйти из рекурсии.

var romanMatrix = [
  [1000, 'M'],
  [900, 'CM'],
  [500, 'D'],
  [400, 'CD'],
  [100, 'C'],
  [90, 'XC'],
  [50, 'L'],
  [40, 'XL'],
  [10, 'X'],
  [9, 'IX'],
  [5, 'V'],
  [4, 'IV'],
  [1, 'I']
];

function convertToRoman(num) {
  if (num === 0) {
    return '';
  }
  for (var i = 0; i < romanMatrix.length; i++) {
    if (num >= romanMatrix[i][0]) {
      return romanMatrix[i][1] + convertToRoman(num - romanMatrix[i][0]);
    }
  }
}
-3
задан Edwin Sturt 4 March 2019 в 07:53
поделиться

1 ответ

(Ниже приведены мои предположения, пожалуйста, дайте мне знать, если я прав / неправ.)

Контекст пузыря: Кредитор берет кредит. Кредитор выплачивает кредит. На полпути через выплату берет еще один кредит.

Технический пузырь: Массив содержит сальдо в порядке убывания. Если значение увеличивается (по сравнению с последним), оно считается пузырем.

Вот как вы можете определить пузырь в массиве:

<?php

/**
 * An array in DESCENDING order (OP)
 */
$array = [
    61029,
    64698,
    67355,
    70000, // has bubble
    43651,
    48346,
    52029,  // has bubble 
    48029,
    48698,
    49355,
    50000,
];

/**
 * An array in ASCENDING order
 */
$asc_array = [
    10,
    20,
    30,
    40,
    50,
    45, //Has bubble
    55
];

/**
 * Given an array, identify a "bubble",
 * aka. an increasing value in an otherwise decreasing value array.
 * Returns the $key where the bubble resides.
 */ 
function identifyBubble($array){
    foreach($array as $id => $item){
        if(!$id){
            continue;
        }
        if(!$array[$id+1]){
            continue;
        }
        if(($array[$id-1] < $array[$id]) && ($array[$id] > $array[$id+1])){
            return $id;
        }
    }
    return false;
}

/**
 * If an array is in ASCENDING order, switch it around,
 * otherwise return the array as is.
 */
function makeArrayDescending($array){
    if(reset($array) < end($array)){
        return array_values(array_reverse($array));
    }
    return $array;
}

var_dump(identifyBubble($array));

var_dump(makeArrayDescending($asc_array));

var_dump(identifyBubble(makeArrayDescending($asc_array)));

Вывод

int(3)
array(7) {
  [0]=>
  int(55)
  [1]=>
  int(45)
  [2]=>
  int(50)
  [3]=>
  int(40)
  [4]=>
  int(30)
  [5]=>
  int(20)
  [6]=>
  int(10)
}
int(2)

Предостережения

[119 ] Это будет работать только для связанных массивов (массивов с порядковыми номерами индексов). Это будет работать только на одномерных массивах.

https://3v4l.org/9UNY6

0
ответ дан dearsina 4 March 2019 в 07:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: