华为OD算法复习5——栈与队列 Javascript
·
这些力扣题目来源:AI推荐+karshey博主
目录
232.用栈实现队列(通过)
var MyQueue = function() {
this.stack=[];
};
/**
* @param {number} x
* @return {void}
*/
MyQueue.prototype.push = function(x) {
this.stack.push(x);
};
/**
* @return {number}
*/
MyQueue.prototype.pop = function() {
return this.stack.shift();
};
/**
* @return {number}
*/
MyQueue.prototype.peek = function() {
return this.stack[0];
};
/**
* @return {boolean}
*/
MyQueue.prototype.empty = function() {
if(this.stack.length==0) return true;
else return false;
};
var obj = new MyQueue()
obj.push(3)
console.log(obj);
var param_2 = obj.pop()
console.log(param_2);
var param_3 = obj.peek()
console.log(param_3);
var param_4 = obj.empty()
console.log(obj);
225. 用队列实现栈(通过)
var MyStack = function() {
this.stack = [];
};
/**
* @param {number} x
* @return {void}
*/
MyStack.prototype.push = function(x) {
this.stack.push(x)
};
/**
* @return {number}
*/
MyStack.prototype.pop = function() {
let out = this.stack.pop();
return out;
};
/**
* @return {number}
*/
MyStack.prototype.top = function() {
return this.stack[this.stack.length-1]
};
/**
* @return {boolean}
*/
MyStack.prototype.empty = function() {
if(this.stack.length==0) return true;
else return false;
};
var obj = new MyStack()
obj.push(3)
console.log(obj);
var param_2 = obj.pop()
console.log(obj);
console.log(param_2);
var param_3 = obj.top()
console.log(param_3);
var param_4 = obj.empty()
console.log(param_4);
20. 有效的括号(通过)
使用栈来匹配。如果当前的字符串是“)”,“】”,“}”,栈里面必须是对应的括号,否则直接返回false
如果是三个左括号,可以直接入栈
最后记得栈不为空代表匹配失败
/**
* @param {string} s
* @return {boolean}
*/
// let s = "()[]{}"
// s = "()"
// s = "(]"
// s = "([])"
s = "([)]"
var isValid = function(s) {
let stack=[];
let cur=-1;
for(let i=0;i<s.length;i++){
if(s[i]=="("||s[i]=="["||s[i]=="{"){
stack.push(s[i]);
cur++;
continue;
}
if(cur==-1){
return false;
}
if (s[i]==")") {
if(stack[cur]=="("){
stack.pop();
cur--;
continue;
} else {
return false;
}
}
if (s[i]=="]") {
if(stack[cur]=="["){
stack.pop();
cur--;
continue;
} else {
return false;
}
}
if (s[i]=="}") {
if(stack[cur]=="{"){
stack.pop();
cur--;
continue;
} else {
return false;
}
}
}
if(cur==-1) return true;
else return false;
};
console.log(isValid(s))
1047. 删除字符串中的所有相邻重复项(通过)
/**
* @param {string} s
* @return {string}
*/
let s ="abbaca";
var removeDuplicates = function(s) {
let arr =[];
arr.push(s[0])
let cur =0;
for(let i=1;i<s.length;i++){
if(s[i]==arr[cur]) {
cur--;
arr.pop()
} else {
cur++;
arr.push(s[i])
}
}
return arr.join("")
};
console.log(removeDuplicates(s));
150. 逆波兰表达式 求值(通过)
Math.trunc 专门可以向0截断,抛弃小数部分
注意顺序。先从栈里面pop出来是减数,而不是被减数
/**
* @param {string[]} tokens
* @return {number}
*/
// tokens = ["2","1","+","3","*"]
// tokens = ["4","13","5","/","+"]
tokens = ["10","6","9","3","+","-11","*","/","*","17","+","5","+"]
var evalRPN = function(tokens) {
let numStack = [];
for(let i=0;i<tokens.length;i++){
if(tokens[i]=="+"||tokens[i]=="-"||tokens[i]=="*"||tokens[i]=="/"){
let num1 = numStack.pop();
let num2 = numStack.pop();
if(tokens[i]=="+") numStack.push(num2+num1);
if(tokens[i]=="-") numStack.push(num2-num1);
if(tokens[i]=="*") numStack.push(num2*num1);
if(tokens[i]=="/") numStack.push(Math.trunc(num2/num1))
} else {
numStack.push(parseInt(tokens[i]))
}
}
return numStack.pop();
};
console.log(evalRPN(tokens));
239. 滑动窗口最大值(通过)
建立一个栈存下标:只有在当前数字比站内数字小或者相等的情况下,才直接入栈,否则清空前面所有比当前数字小的下标。
这样可以保证栈里面的第一个数字永远是当前滑动窗口的最大值
每次滑动之后把最大值存起来
滑动之前还需要检查一下,当前存储的最大值下标是否不在滑动窗口的区间内
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
// nums = [1,3,-1,-3,5,3,6,7], k = 3
// nums = [3,1,1,3], k=3;
nums = [7,2,4], k=2;
var maxSlidingWindow = function(nums, k) {
let max=nums[0];
let myStack = [];
let answer = []
for(let i=0;i<k;i++){
if(myStack.length==0 || nums[i]<=nums[myStack[myStack.length-1]] ){
myStack.push(i);
} else {
while(myStack.length!=0 && nums[myStack[myStack.length-1]]<nums[i]){
myStack.pop();
}
myStack.push(i);
}
}
answer.push(nums[myStack[0]])
for(let i=k;i<nums.length;i++){
if(myStack.length!=0 && myStack[0]<i-k+1){
myStack.shift();
}
if(myStack.length==0 || nums[i]<=nums[myStack[myStack.length-1]] ){
myStack.push(i);
} else {
while(myStack.length!=0 && nums[myStack[myStack.length-1]]<nums[i]){
myStack.pop();
}
myStack.push(i);
}
answer.push(nums[myStack[0]]);
}
return answer;
};
console.log(maxSlidingWindow(nums,k));
347.前 K 个高频元素(通过)
先用对象存储每个数字的出现频率,然后利用sort()自定义排序,最后用slice切割前k个高频数字
/**
* @param {number[]} nums
* @param {number} k
* @return {number[]}
*/
nums = [1,1,1,2,2,3], k = 2
var topKFrequent = function(nums, k) {
let stat = {};
for(let i=0;i<nums.length;i++){
if(stat[nums[i]]==undefined) stat[nums[i]]=1;
else stat[nums[i]]+=1;
}
let ans = (Object.entries(stat).sort((a,b)=>b[1]-a[1])).map(item=>parseInt(item[0])).slice(0,k);
return ans;
};
console.log(topKFrequent(nums,k))
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)