Php 序列字符串分组算法
我真的很难设计一个算法来解决以下问题: 我将接受一系列输入,如下所示:Php 序列字符串分组算法,php,algorithm,sequence,Php,Algorithm,Sequence,我真的很难设计一个算法来解决以下问题: 我将接受一系列输入,如下所示: $input = array('100', '101', '102', '110', '111', '112'); 输出应为包含以下内容的字符串: "100-102, 110-112". 基本上,我需要做的是将数字按顺序分组,比如从100到102,然后将它们组成一个字符串,因为所有的数字都是一个序列。但由于值110不在102的旁边,因此应将值110到112分组,并形成字符串“110-112”。 输入不限于数字,但它们是字
$input = array('100', '101', '102', '110', '111', '112');
输出应为包含以下内容的字符串:
"100-102, 110-112".
基本上,我需要做的是将数字按顺序分组,比如从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将不分组为AB-1-DF-AB-3-DF。这简化了问题,0前缀也无关紧要,001和002可以分组为1-2
简单的规则基本上是这样的:
(character) - (number)
ABC - 1
字符的不同意味着完全不同。使用标准字符串比较谓词(字母顺序)对数组进行排序 然后成对比较字符串 隔离字符串前缀(除最后一个字符外的所有字符),并比较是否相等
如果接受由多个数字组成的数字后缀,则需要隔离后缀,将其转换为整数,并对剩余前缀进行比较。(正则表达式可以帮助您。)如果顺序项彼此相邻,那么这里有一些东西应该可以工作。您可能想编写自己的
are\u 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);
这个问题有点模糊。有像ABC-1-DF、ABC-2-DF这样的东西吗?您是否必须处理0前缀
001、002
?当有多个数字时会发生什么情况,例如ABC-2-DF-1、ABC-3-DF-1、ABC-2-DF-2?是。。将有很多值,但基本上最后的数字将只有一个重要的,所以ABC-1-DF和ABC-2-DF是两个独立的东西。如果它的ABC-DF-1和ABC-DF-2,那么它们可以分组,感谢您注意到,关于前缀…不,我不需要处理0前缀XI更新了描述将字符串中的最后一个数字(例如ABC4G54
拆分为前缀ABC4G
和数字54
),然后将这些对(前缀,数字)放入数组并排序,然后运行正常的分组算法。拆分部分可以用正则表达式完成,甚至可以用字符串末尾的一个简单循环来完成。那么数组('N1','N02','N003')?需要是“N1-N3”吗?还是“N1-N003”?阵列(“H1N1”、“H1N2”、“H2N3”、“H2N4”)怎么样?我认为在PHP中,您不必将字符串转换为整数。例如,(“2”+1==“3”)
将返回一个布尔值true
,(“2”+1==“4”)
将返回一个布尔值false
。但是对于其中包含字符的字符串如何呢?@muffin考虑一下如何确定两项是否是连续的。函数是按顺序进行检查的。你会怎么写?(或者用文字说明如何检查两个字符串是否是连续的。)哦,我明白了。这就是进行比较的地方。。好的,好的,谢谢
array(3) {
[0]=>
string(3) "1-2"
[1]=>
string(1) "4"
[2]=>
string(3) "6-8"
}