Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 序列字符串分组算法_Php_Algorithm_Sequence - Fatal编程技术网

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"
}