js前端算法刷题---栈

1.有效的括号20:

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。

示例 1:

输入:s = “()” 输出:true
示例 2:

输入:s = “()[]{}” 输出:true
示例 3:

输入:s = “(]” 输出:false

var isValid = function(s) {
        var stack=[]
        for(let i in s){
            if(s[i]=='('||s[i]=='{'||s[i]=='['){
                stack.push(s[i])
            }else {
                j=stack[stack.length-1];
                if ((s[i]==')'&& j=='(')||(s[i]=='}'&& j=='{')||(s[i]==']'&& j=='[')){
                    stack.pop()
                }else return false
            }
        }
    return stack.length==0
};

2. 删除字符串中的所有相邻重复项1047

给出由小写字母组成的字符串 S,重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:“abbaca” 输出:“ca”
解释: 例如,在 “abbaca” 中,我们可以删除 “bb”
由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 “aaca”,其中又只有 “aa”
可以执行重复项删除操作,所以最后的字符串为 “ca”。

var removeDuplicates = function(s) {
    var stack=[]
    for(let i in s){
        prev=stack[stack.length-1]
        if (s[i]!=prev){
            stack.push(s[i])
        }else{
            stack.pop()
        }
    }
    return stack.join('')
};

3.简化路径71

给你一个字符串 path ,表示指向某一文件或目录的 Unix 风格 绝对路径 (以 ‘/’ 开头),请你将其转化为更加简洁的规范路径。

在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…)
表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。任意多个连续的斜杠(即,‘//’)都被视为单个斜杠 ‘/’ 。
对于此问题,任何其他格式的点(例如,‘…’)均被视为文件/目录名称。

请注意,返回的 规范路径 必须遵循下述格式:

始终以斜杠 ‘/’ 开头。 两个目录名之间必须只有一个斜杠 ‘/’ 。 最后一个目录名(如果存在)不能 以 ‘/’ 结尾。
此外,路径仅包含从根目录到目标文件或目录的路径上的目录(即,不含 ‘.’ 或 ‘…’)。 返回简化后得到的 规范路径 。
示例 1:

输入:path = “/home/” 输出:“/home” 解释:注意,最后一个目录名后面没有斜杠。
示例 2:

输入:path = “/…/” 输出:“/” 解释:从根目录向上一级是不可行的,因为根目录是你可以到达的最高级。
示例 3:

输入:path = “/home//foo/” 输出:“/home/foo” 解释:在规范路径中,多个连续斜杠需要用一个斜杠替换。
示例4:

输入:path = “/a/./b/…/…/c/” 输出:“/c”

var simplifyPath = function(path) {
     var stack=[]
    var arr=path.split('/')
    for(let i in arr){
        if (arr[i]!='.'&& arr[i]!=''){
            stack.push(arr[i])
        }
    }
    for (var j =0;j<stack.length;){
        if (stack[j]=='..'){
                    if(j>0){stack.splice(j-1,2);}
                    else {stack.shift();}
                    j=j-1;
                }else j++;}
    return '/'+stack.join('/')
};


方法二:
var simplifyPath = function(path) {
        let s=path.split("/")
        let stack=[]
        for(let i of s){
            if(i!="."&&i!=".."&&i!=""){
                stack.push(i)
            }
            if(i==".."){
                if(stack.length!=0){stack.pop()}
            }else{continue}
        }
        return "/"+stack.join("/")
        
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高二水令

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值