基于连续出现缩短数组 我正在学习PHP,下面列出了相关的问题。语言并不重要,所以我将用伪代码向您介绍这一点。当然,伪代码答案很好
比如说,有一个由两个不同的重复元素组成的列表——例如,两个单个字符。因此,我的列表大致如下所示:基于连续出现缩短数组 我正在学习PHP,下面列出了相关的问题。语言并不重要,所以我将用伪代码向您介绍这一点。当然,伪代码答案很好,php,arrays,algorithm,Php,Arrays,Algorithm,比如说,有一个由两个不同的重复元素组成的列表——例如,两个单个字符。因此,我的列表大致如下所示: myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...] myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...] myList* = shorten(myList) 然而,这不是我想要的形式。相反,列表应如下所示: myList = [C, C, D, C, D, D, D, C, C, D, C,
myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...]
myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...]
myList* = shorten(myList)
然而,这不是我想要的形式。相反,列表应如下所示:
myList = [C, C, D, C, D, D, D, C, C, D, C, D, C, C, ...]
myList* = [CC, D, C, DDD, CC, D, C, D, CC, ...]
myList* = shorten(myList)
将单个字符列表转换为包含后续字符连续字符串作为元素的列表,最优雅的方法是什么?我觉得我的解决方案相当糟糕,因为它涉及多重嵌套的if语句、各种状态变量和其他不好的方面
伪代码走开!非常感谢您对本协议的任何实施
shorten()
你向我扔东西。你可以通过跟踪当前字符和最后一个字符,对数组进行一次扫描:
function shorten($myList) {
$myList[] = ''; // add a dummy char at the end of list.
$result = array(); // result to be returned.
$last_char = $myList[0]; // initilize last char read.
$combine = $last_char; // initilize combined string.
for($i=1;$i<count($myList);$i++) { // go from index 1 till end of array.
$cur_char = $myList[$i]; // current char.
if($cur_char != $last_char) {
$result[] = $combine; // time to push a new string into result.
$combine = $cur_char; // reset combine string.
} else {
$combine.=$cur_char; // is cur char is same as prev..append it.
}
$last_char = $cur_char; // for next iteration cur become last.
}
return $result; // return result.
}
函数缩短($myList){
$myList[]='';//在列表末尾添加一个虚拟字符。
$result=array();//要返回的结果。
$last_char=$myList[0];//初始化上次读取的字符。
$combine=$last_char;//初始化组合字符串。
对于($i=1;$i$myList=array('C','C','D','C','D','D','D','C','C','D','C','C','C');
函数(列表){
$newList=array();
foreach($key=>$entry){
如果($key==0){
$newList[]=$entry;
}elseif($entry==substr($newList[count($newList)-1],0,1)){
$newList[计数($newList)-1]。=$entry;
}否则{
$newList[]=$entry;
}
}
返回$newList;
}
$shortenedList=缩短($myList);
var_dump($myList);
回声“
”;
var_dump($shortenedList);
使用PHP 5.3闭包和:
比Max的答案短一点
$mylist = array("a","b","b","b","c","c","d");
function shorten($array) {
$str = implode("",$array); // step 1: make string from array of chars
preg_match_all("/(\w)\\1*/",$str,$matches); // step 2: split into chunks
return $matches[0]; // step 3: that's all
}
print_r(shorten($mylist));
您可能会在代码的第三行收到未定义的偏移量-1,但我非常喜欢这个解决方案。@[Jan Turoň]您明白了。是的,我通过设置错误级别来排除E_通知错误,这有点作弊。-@[Jan Turoň]我更新了代码,添加了一行,但现在它不会接受错误,也不会计算每次迭代两次$a的长度。
$mylist = array("a","b","b","b","c","c","d");
function shorten($array) {
$str = implode("",$array); // step 1: make string from array of chars
preg_match_all("/(\w)\\1*/",$str,$matches); // step 2: split into chunks
return $matches[0]; // step 3: that's all
}
print_r(shorten($mylist));