2020/11/12算法

时隔多日继续
有效括号
题目描述:
在这里插入图片描述
解题,用到了Map和栈

var isValid = function(s) {
	//括号的个数如果是奇数肯定是不能匹配的
    if(s.length%2===1)return false
    //声明一个map实例包含左括号
    let strmap=new Map([
        [')','('],
        ['}','{'],
        [']','['],
        ])
        var stack=[]
    for(var i=0;i<s.length;i++){
    //如果需要匹配的括号在map实例中
        if(strmap.has(s[i])){
        //判断栈顶的元素是否和哈希表中的匹配
            if(stackTop===strmap.get(s[i])){
            //如果相等弹栈
            stack.pop()
        }else{
        //否则不匹配
            return false
        }
        }
        else{
        //如果遍历到的元素不在哈希表中,就压栈
            stack.push(s[i])
        }
        //栈顶就是刚刚添加进去的元素
        var stackTop=stack[stack.length-1]
    }
    return stack.length===0?true:false


};

** 多维数组 flatten 将多维数组转化为一维数组。 [1, [2, [3, [4, 5]]], 6] -> [1, 2, 3, 4, 5, 6]**

// 多维数组 flatten
// 将多维数组转化为一维数组。
// [1, [2, [3, [4, 5]]], 6] -> [1, 2, 3, 4, 5, 6]
function flatten(arr){
    var result=[]
    function fn(target,arry){
        for(let i=0;i<arry.length;i++){
            var item=arry[i]
            if(Array.isArray(item)){
                fn(target,item)
            }else{
                target.push(item)
            }
        }
    }
    fn(result,arr)
    return result
}
console.log(flatten([1, [2, [3, [4, 5]]], 6]));

在函数内部定义一个函数,循环判断每一个元素是否是数组,如果是数组就继续调用,如果不是数组就推到另外一个数组里,最后返回一个这个数组

2021/1/12
其实中间的这段时间也一直在坚持但是没有记录下来。

面试题 02.03. 删除中间节点
实例:
输入:单向链表a->b->c->d->e->f中的节点c
结果:不返回任何数据,但该链表变为a->b->d->e->f

/**
 * Definition for singly-linked list.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = null;
 * }
 */
/**
 * @param {ListNode} node
 * @return {void} Do not return anything, modify node in-place instead.
 */
var deleteNode = function(node) {
    //把当前节点的值等于下一个节点的值
        node.val=node.next.val
    //当前节点的下一个节点指向下一个节点的下一个节点,相当于是把需要删除的节点的一个替换。
        node.next=node.next.next
};

 解题思路:由于当前只知道一个节点,所以我们没有办法直接将需要被删除节点的上一个节点指向下下个节点,也就是由b直接指向d,但是可以通过另一种形式来实现,但其根本就是将上一个节点的next指向删除节点的下一个节点。
 把需要删除的节点的值val等于下一个节点,然后再把当前节点的next指向下下个节点,相当于是跳过了一个节点,也就等同于删除了一个节点,虽然删除的节点和需要被删除的节点实际不同,但是实现的效果是一样的。

2021/1/18
1512.好数对的数目,题目应该很简单但是重要的是思路,和解题的方法。
在这里插入图片描述

 //暴力求解
        var numIdenticalPairs = function(nums) {
            let num=0
            for(let i=0;i<nums.length;i++){
                for(let j=1;j<nums.length;j++){
                    if(nums[i]===nums[j]&&i<j) num++
                }
            }
            return num
        }
        //利用哈希表
        // map 的key代表数字,value代表重复的次数
        var numIdenticalPairs = function(nums) {
            let map={}
            let count=0
            for(let i=0;i<nums.length;i++){
               let key=String(nums[i])
               map[key]=map[key]===undefined?0:map[key]+1
               count=count+map[key]
            }
            return count
        }
        //双游标的做法
        var numIdenticalPairs = function(nums) {
            let count=0
            let j=0
            for(let i=0;i<nums.length;j++){
                if(j===nums.length){
                    j=0,
                    i++
                }
                i < j && nums[j] === nums[i] && count++
            }
            return count
        }

第一种就是通过双重for循环依次去比较,第二种是通过key去存储对应的数字,value存储出现的次数。
第三种是通过双游标的做法。两个标志都在移动然后比较。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值