题解 | #点击消除#
点击消除
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。
- 将字符串转化为数组。先遍历,如果第i个元素和第i+1个元素不相等,则continue;否则就去掉从i开始的2个元素(.splice(i,2)),并再次调用函数。
- 如此往复,当数组中相邻的元素不再相同,for循环一直continue,直到结束。
- 最后判断长度
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:其实一开始想到的就是递归,但还是更优解还是栈
牛客算法题 文章被收录于专栏
牛客算法题记录