题解 | #点击消除#

点击消除

http://www.nowcoder.com/practice/8d3643ec29654cf8908b5cf3a0479fd5

题目:

简单来说就是一串字符串,相邻的如果相同就消除掉,最后输出剩下的。字符串小写字母组成。(字符串长度不大于300000)如果为空串则输出0

思路一:

本体的归类就是栈,那么就用栈来做。创建一个栈,如果栈顶元素和当前遍历到的元素str.charAt(i)相等,则取出栈顶元素,否则就将str.charAt(i)入栈。最后判断即可

var line = readline();
function func(str){
    var result = [];
    for (var i = 0; i < str.length; i++) {
            if (str.charAt(i) == result[result.length - 1]) result.pop();
            else result.push(str.charAt(i));
    }
    return result.length == 0 ? 0 : result.join('');
}


console.log(func(line));

思路二:

其实也可以用递归,不过在浏览器和vscode都能通过,而牛客不能通过,大概是因为太耗时了,超过了1s。

  1. 将字符串转化为数组。先遍历,如果第i个元素和第i+1个元素不相等,则continue;否则就去掉从i开始的2个元素(.splice(i,2)),并再次调用函数。
  2. 如此往复,当数组中相邻的元素不再相同,for循环一直continue,直到结束。
  3. 最后判断长度
var line = readline();
var lines1 = line.split('')

function fab(lines){
    for(let i = 0; i < lines.length-1; i++){
        if(lines[i] !== lines[i+1]){
            continue
        }else{
            lines.splice(i,2)
            fab(lines)
        }
    }
    if(lines.length === 0){
        return 0
    }
    return lines.join('')
}
console.log(fab(lines1))

ps:其实一开始想到的就是递归,但还是更优解还是栈

牛客算法题 文章被收录于专栏

牛客算法题记录

全部评论

相关推荐

04-12 13:42
江南大学 C++
点赞 评论 收藏
分享
04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
评论
1
1
分享

创作者周榜

更多
牛客网
牛客企业服务