1. 程式人生 > >百度的一道二面算法題分析:補全括號序列

百度的一道二面算法題分析:補全括號序列

subst 地址 block lock sub amp 循環 imp not

算法題:補全括號序列

百度二面遇到的一個問題

大概意思就是

給出一個中括號序列,在序列前後可以加中括號字符,補全它。。。

當時沒想起來解決辦法,然後涼涼了,後來專門去搞了這道題,終於搞定

思路在註釋裏寫的比較詳細了,此處不再贅述(用了類似棧的思想)

<?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.md

轉載請註明出處

百度的一道二面算法題分析:補全括號序列