2014-10-13 3 views
2

Я действительно трудное время разработки алгоритма для решения следующей задачи:Алгоритм группировки последовательных строк

Я буду принимать множество входов, как показано ниже:

$input = array('100', '101', '102', '110', '111', '112'); 

и выход должна быть строка, содержащая:

"100-102, 110-112". 

в основном то, что мне нужно сделать, это номеров группы в последовательности, как от 100 до 102 и сформировать их в строке «100-102» так как все числа образуют последовательность. Но так как значение 110 не находится рядом с 102, значения 110 - 112 должны быть сгруппированы и сформирована строка «110-112».

Ввод не ограничивается числами это строки. Так что я буду ожидать входы нравится:

$input = array('N1', 'N2', 'N3', 'GX1', 'GX2', 'Z-3'); 

Следуя той же схеме, вывод должен быть:

"N1-N3, GX1-GX3, Z-3" 

Мой псевдокод (я новичок) для решения данной проблемы для чисел по крайней мере есть:

$sequenceArr = []; 
$string = ''; 
foreach(...){ 

    if(nextValue == prevValue+1){ 
     $sequenceArr[] = nextValue; 
    }else{ 
     //form the string from the sequenceArr 
     //if the preceeding string doesn't conform to the pattern anymore. 
    } 
} 

проблема я думаю, что будет сталкиваться выше, если входы не отсортированы .. Я мог «сортировать» их, но как насчет строк со значениями символов в них? Я немного потерян, и я не думаю, что я пойду с этим решением.

* ОБНОВЛЕНО ДАЛЕЕ ОПИСАНИЕ:

Это будет просто простой алгоритм группировки, только последнее число будет указывать группировка,

AB-1-ДФ АБ-2-DF и АВ-3 -DF будет NOT сгруппированы в AB-1-DF-AB-3-DF. Это упрощает проблему, также префикс 0 не имеет значения, 001 и 002 могут быть сгруппированы как 1-2.

простое правило в основном это:

(character) - (number) 
    ABC  -  1 

Различие в характере означает совсем другое дело.

+0

Проблема немного под определенным. Есть ли такие вещи, как 'ABC-1-DF, ABC-2-DF'? Вам нужно иметь дело с 0 префиксом '001, 002'? Что произойдет, когда есть несколько номеров, например. 'ABC-2-DF-1, ABC-3-DF-1, ABC-2-DF-2'? – nhahtdh

+0

да .. будет много значений, но в основном последние цифры будут только те, которые будут иметь значение, поэтому ABC-1-DF и ABC-2-DF являются двумя отдельными вещами. Если его ABC-DF- 1 и ABC-DF-2, тогда они могут быть сгруппированы, спасибо, что заметили, что о префиксе ... нет, мне не нужно иметь дело с 0 префикс – muffin

+0

i обновлено описание – muffin

ответ

1

Это то, что должно работать, если последовательные элементы находятся рядом друг с другом. И вы, вероятно, хотите, чтобы написать свою собственную are_sequential функцию:

$input = ["1","2","4","6","7","8"]; 

$len = count($input); 
$result = []; 

function are_sequential($a,$b){ 
    return $a + 1 == $b; 
} 

$i = 0; 

while ($i < $len - 1){ 
    $first = $input[$i]; 
    $last = $input[$i]; 
    $i++; 
    $sequenceLength = 1; 
    while (are_sequential($last, $input[$i])){ 
    $last = $input[$i]; 
    $sequenceLength++; 
    if ($i < $len - 1){ 
     $i++; 
    } 
    } 
    if ($sequenceLength > 1){ 
    $result[] = $first . "-" . $last; 
    } else { 
    $result[] = $first; 
    } 
} 

var_dump($result); 

Выход:

array(3) { 
    [0]=> 
    string(3) "1-2" 
    [1]=> 
    string(1) "4" 
    [2]=> 
    string(3) "6-8" 
} 
+0

, но как насчет строк, содержащих в себе символ? – muffin

+0

@muffin Подумайте, как бы вы хотели определить, являются ли два элемента последовательными. Функция, 'are_sequential' проверяет это. Как бы вы его написали? (Или прокомментируйте слова, как бы вы могли проверить, являются ли две строки последовательными.) –

+0

oohhhhh, я понимаю, что это так, где происходит сравнение. Хорошо, хорошо .. спасибо :) – muffin

1

Сортируйте массив все чаще, используя стандартный предикат сравнения строк (в алфавитном порядке).

Затем сравните строки в парах.

Изолируйте префикс строки (все символы, кроме последнего), и сравните для равенства.

Если вы принимаете числовые суффиксы, состоящие из более чем одной цифры, вам нужно будет изолировать суффикс, преобразовать его в целое и выполнить сравнение на оставшемся префиксе. (Регулярные выражения могут вам помочь.)

+0

Я думаю, что в PHP вам не нужно преобразовывать строку в целое число. Например, '(" 2 "+ 1 ==" 3 ")' будет возвращать логическое 'true', а' ("2" + 1 == "4") 'будет возвращать логическое' false'. –

Смежные вопросы