找出給定字符串中的所有的連續(xù)遞增和連續(xù)遞減的子字符串攻旦。子字符串長度至少是2画株。
舉例1輸入“abcxd321"輸出“abc"钝腺,“321"。說明:其中“abc”是連續(xù)遞增的字符串耘成,“321”是連續(xù)遞減榔昔。
舉例2輸入“abcdc”輸出“abcd”。
說明:子字符串不重疊瘪菌,字符優(yōu)先匹配到前面的遞增或遞減序列里撒会。
這是我面試的一家公司的筆試題,要求30分鐘內(nèi)作答完畢师妙,我沒做完诵肛。。默穴。故記錄下
思路
遍歷字符串怔檩,從前至后依次比較每個字符的大小(使用ord函數(shù)比較ASCII碼)
用變量保存連續(xù)子串的開始的位置(偏移量)蓄诽,當(dāng)然發(fā)現(xiàn)不滿足連續(xù)條件時薛训,輸出子串,并重置起始的偏移量
代碼
<?php
$str = 'abcxd321';
//輸出符合條件的字串并重置相關(guān)變量
function reset_echo($str)
{
if (isset($GLOBALS['start'])) {
//輸出符合條件的子串
echo substr($str, $GLOBALS['start'], $GLOBALS['k']+1), "\r\n";
}
//重置 $flag和 $start
unset($GLOBALS['flag']);
unset($GLOBALS['start']);
}
//遍歷字符串
for ($k=0; $k<strlen($str)-1; $k++) {
//獲取當(dāng)前字符和下一個字符的ASCII碼仑氛,用于比較
$now = ord($str[$k]);
$next = ord($str[$k+1]);
//下一個字符與當(dāng)前字符的差是 1或-1時许蓖,說明字符串時遞增或遞減
if (in_array($next - $now , [-1,1])) {
//定義標(biāo)志位 $flag 1 代表遞增 -1 代表遞減
if (!isset($flag)) {
$flag = $next - $now;
}
//定義連續(xù)的子串的起始位 $start
if (!isset($start)) {
$start = $k;
}
//當(dāng)下個字符與當(dāng)前字符的差 不等于 標(biāo)志位 ,說明遞增或遞減的形態(tài)已經(jīng)發(fā)生了變化
if ($next - $now != $flag) {
reset_echo($str);
}
} else {
//當(dāng)下個字符與當(dāng)前字符的差 不等于 1 或 -1 說明根本不是遞增或遞減
//輸出符合條件的字串调衰,并重置$flag 和 $start
reset_echo($str);
}
}
//字符串遍歷結(jié)束了,輸出符合條件的字串
reset_echo($str);
最后
代碼是筆試完之后自阱,花了快一個小時才擼出來的嚎莉,太笨了,哈哈沛豌。
看起來有點(diǎn)丑趋箩,不過我覺得這樣寫比較容易理解赃额,算法復(fù)雜度應(yīng)該也沒啥問題,畢竟只遍歷了一次叫确。
那就先這樣了跳芳,感謝閱讀~