前言
算法,在行业里越来越重要,一线互联网公司也非常注重算法,所以在面试时基本上都有涉及到。字节跳动是出了名的爱问算法题,几乎每一面都要问到算法。实际上,现在很多公司都会问算法,尤其是对于应届生来说,要求更高,所以想要进大厂,搞定算法是很重要的。
前段时间,我就去面了一次字节跳动,好不容易进到第四面,眼看offer就要拿到手了,可惜竟然被一道“算法题”给拦截了,与字节的offer失之交臂。今天就分享一下这道算法题,让我们好好聊一聊,怎么搞定字节跳动的面试吧!
拦截我的offer,竟是这道算法题
给定一个只包括 '(',')'的字符串,判断字符串是否有效。注:空字符串属于有效字符串
示例 1:
输入: "(())"
输出: true
实例 2:
输入: "())("
输出: false
第一眼看到这道题,我去,这么简单,稳了(因为一面的时候,刚刚被面试官怼过勇者斗恶龙的DP题,在 leetcdoe 属于 hard 级别)。
于是我也不假思索直接用栈来解决了,相信 99% 都会用栈解决吧?这里我稍微说一下过程吧,步骤如下:
1、在遍历字符串的过程中,遇到 "(" 就让它入栈,遇到 ")" 就判断下栈里面有没有 "(" :
(1)、如果有,则把处于栈顶的 "(" 弹出,相当于和 ")" 进行匹配,然后继续往后遍历字符串
(2)、如果没有,则匹配失败。相当于字符串的最前面出现了 ")",显然这是不合理的。
2、当字符串遍历完成,判断栈是否为空,如果为空则表示字符串有效,否则无效。
为了兼顾小白,我该给你们画了个图演示,,,,我太良心了。
代码如下所示:
public static boolean isValid(String s){
if(s == null || s.length() < 1)
return true;
int n = s.length();// 字符串长度
// 创建一个栈来装字符
Stack<Character> stack = new Stack<>();
// 遍历字符串
for(int i = 0; i < n; i++){
// 获取字符串的第 i 个字符
char c = s.charAt(i);
if(c == '('){
stack.push(c);
}else{
if(stack.isEmpty())
return false;
else
stack.pop();
}
}
// 判断是否为空
if(stack.isEmpty())
return true;
return false;
}
接着面试官说我这道题的空间复杂度是 O(n),问我能优化一下吗?
说实话,如果你做过 leetcode 的第 20 题,可能你的脑子会被定向也不一定,因为那道题用栈来处理就是最优解的了。不过这道题属于简化版,