百度二面遇到的一個問題php
大概意思就是git
給出一箇中括號序列,在序列先後能夠加中括號字符,補全它。。。github
當時沒想起來解決辦法,而後涼涼了,後來專門去搞了這道題,終於搞定算法
思路在註釋裏寫的比較詳細了,此處再也不贅述(用了相似棧的思想)數組
<?php /** * 字符串轉數組 * @param $str string 輸入的字符串 * @return array 轉換以後的結果數組 */ function strToArray($str) { // 強制轉換爲字符串 $str = (string)$str; $arr = []; // 計算長度,考慮中文 $len = mb_strlen($str); // 循環截取,放到數組中 for ($i = 0; $i < $len; ++$i) { $arr[] = mb_substr($str, $i, 1); } return $arr; } /** * 判斷括號是否已匹配 * @param $str string 輸入的括號序列 * @return array 返回結果[bool,簡化以後的括號數組] */ function bracketsTest($str) { $ls = strToArray($str); $sp = 0; // StackPointer 把數組想象成一個棧,只在棧尾操做 if (strlen($str) == 0) { return [true, []]; } else if (strlen($str) == 1) { return [false, $ls]; } while ($sp + 1 < count($ls)) { // 若是棧尾的字符和下一個入棧字符匹配 if ($ls[$sp] == '[' && $ls[$sp + 1] == ']') { // 刪除這兩個字符 array_splice($ls, $sp, 2); if ($sp > 0) { // 棧尾指針前移1位 --$sp; } } else { // 入棧 ++$sp; } } if (count($ls) == 0) { return [true, []]; } else { echo implode($ls), "\n"; return [false, $ls]; } } /** * 補全括號序列 * @param $str string 待補全的括號序列 * @return string */ function completingBrackets($str) { // 先判斷,獲得判斷結果和簡化結果 $testRes = bracketsTest($str); if ($testRes[0]) { return $str; } // 左右需補全的字符串 $lC = $rC = ''; foreach ($testRes[1] as $b) { if ($b == '[') { $rC .= ']'; } else { $lC .= '['; } } // 拼合 return $lC . $str . $rC; } echo completingBrackets('][][');
當時二面的時候沒想起來解法,後來冷靜分析一下其實不太難指針
個人文章倉庫:Github地址 https://github.com/JeffreyWxj/MarkdownNote
本文地址:https://github.com/JeffreyWxj/MarkdownNote/blob/master/Coding%E7%AC%94%E8%AE%B0/%E7%AE%97%E6%B3%95%EF%BC%9A%E6%8B%AC%E5%8F%B7%E5%BA%8F%E5%88%97%E8%A1%A5%E5%85%A8.mdcode
轉載請註明出處字符串