我真的很难设计出一种算法来解决以下问题:
我将接受一系列输入,如下所示:
$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-DF AB-2-DF和AB-3-DF将 NOT 分组为AB-1-DF-AB-3-DF。这简化了问题,0前缀也无关紧要,001和002可以分组为1-2。
简单的规则基本上是这样的:
(character) - (number)
ABC - 1
性格上的差异意味着完全不同的东西。
答案 0 :(得分:1)
使用标准字符串比较谓词(字母顺序)逐渐对数组进行排序。
然后成对比较字符串。
隔离字符串前缀(除了最后一个字符之外的所有字符),并进行相等性比较。
如果您接受由多个数字组成的数字后缀,则需要隔离后缀,将其转换为整数,并对剩余前缀进行比较。 (正则表达式可以帮助你。)
答案 1 :(得分: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"
}