百度的一道二面算法题分析:补全括号序列

算法题:补全括号序列

百度二面遇到的一个问题

大概意思就是

给出一个中括号序列,在序列前后可以加中括号字符,补全它。。。

当时没想起来解决办法,然后凉凉了,后来专门去搞了这道题,终于搞定

思路在注释里写的比较详细了,此处不再赘述(用了类似栈的思想)

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

转载请注明出处

原文地址:https://www.cnblogs.com/wxjblog/p/8904562.html

时间: 2024-11-08 17:27:37

百度的一道二面算法题分析:补全括号序列的相关文章

一道有趣的算法题。。。

题目意思: 用1, 2, 3 ,4 ,5, 6, 7, 8, 9 组成3个三位数 abc, def 和 ghi, 每个数字恰好使用一次,要求abc:def:ghi = 1:2:3.输出所有解. 分析: 模拟所有三位数,判断条件有二: 一.i(abc):j(def):k(ghi)=1:2:3 二.判断是否出现的1~9之间的所有数字 代码: /** *一道有趣的算法题 * */ #include<iostream> #include<cstdio> using namespace st

一道有趣的算法题:仿照Excel的列编号,给定一个数字,输出该列编号字符串

       By Long Luo 最近遇到一个算法题: 仿照Excel的列编号,给出一个数字,输出该列编号字符串. 例如:A对应1,Z对应26,AA对应27,AZ对应52 ...... 这个题目是一个典型的26进制思路去处理,但是这个题目里面有很多陷阱,在1, 26, 52等特殊情况进行考虑,经过晚上接近1个小时的编写,完成的代码如下: C++代码如下: #include <iostream> #include <string.h> using namespace std; /

第一篇博客--记面陌陌科技计算机视觉算法工程师被刷经历(附面试过程中被问倒的一些算法题分析)

求职季,真的会让一个人变得有些不一样吧,比如我,对于一个菜鸟来说,最近一段时间焦虑不安外加有点自闭... 前段时间在校内网上看到了陌陌科技内推计算机视觉算法工程师和机器学习算法工程师的消息,抱着试试的心态整理了一份简历按照提供的邮箱投出去了,我想这次应该又是石沉大海了吧,谁想在一周前闷热的一天在嘈杂的餐厅接到了陌陌科技HR的电话,一周后的周五下午4点在西安的一家咖啡馆参加面试.我问清了时间地点并道谢了HR后并挂了电话继续吃饭. 好吧,这周每天都有各个公司的笔试,外加这周周五上午的组会轮到我做组会

一道简单的算法题(三角形数阵)

今天同学给了几个算法题,看了一遍,觉得第一道题简单,试着写了一下,果然很简单. 题目是 核心代码只有 for(var i= 0; i< N; i++){ str += '<div class="item">'; for(var j= 0; j< N-i; j++){ str += '<div class="list">'+ start +'</div>'; start++; if(start > T){ star

记一道有意思的算法题Rotate Image(旋转图像)

题出自https://leetcode.com/problems/rotate-image/ 内容为: You are given an n x n 2D matrix representing an image. Rotate the image by 90 degrees (clockwise). Follow up: Could you do this in-place? 简单的说就是给出一个n*n的二维数组,然后把这个数组进行90度顺时针旋转,而且不能使用额外的存储空间. 最初拿到这道题

常见算法题:判断表达式括号是否匹配

题目:设计一个算法,判断用户输入的表达式中括号是否匹配,表达式中可能含有圆括号.中括号和大括号. 思路:建立一个顺序栈,当表达式中有左括号时将其入栈,当出现右括号时,将栈顶元素出栈,检查与当前右括号是否匹配.最后如果栈为空则表示该表达式中的括号是匹配的. 代码: #include<iostream> #include<string> using namespace std; #define MaxSize 20 //字符串栈 class Stack { char *data; in

算法题---带加减乘除和括号的单字母变量表达式转化成逆波兰式

#include <stdio.h> #include <stdlib.h> #include <malloc.h> #define STACK_INIT_SIZE 100 #define STACK_INCREAMENT 10 #pragma warning(disable:4996)//我用的vs2015,不加这句用scanf会报错(使用了unsafe的函数) typedef struct { //栈 char *base; char *top; int stack

算法题:找出同一个序列中的最大值和最小值

package arithmetic; /** * 同时找出一个序列中最大值和最小值 * 分两种情况:(1)序列只有两个元素 * (2)序列有多个元素,有多个元素分别从序列的两端开始查找 * @author SHI */ public class MaxAndMin { public static void main(String[] args) { int[] a = { 122, 41, 4, 5, 7, 2, 89, 122, 34, 56 }; int low = 0; int high

算法习题---字符串的全排序列

一:什么是全排列 排列:从n个元素中任取m个元素,并按照一定的顺序进行排列,称为排列: 全排列:当n==m时,称为全排列: 比如:集合{ 1,2,3}的全排列为: { 1 2 3} { 1 3 2 } { 2 1 3 } { 2 3 1 } { 3 2 1 } { 3 1 2 } 我们可以将这个排列问题画成图形表示,即排列枚举树,比如下图为{1,2,3}的排列枚举树,此树和我们这里介绍的算法完全一致: 二:全排列实现思路 (1)n个元素的全排列=(n-1个元素的全排列)+(另一个元素作为前缀):