javaScript力扣刷题——简单哈希表(一)

1. 两数之和

 

不用2次循环,查找target-nusms就可

MAP.get()这个数的下标

var twoSum = function(nums, target) {
    var MAP = new Map();    // 创建 MAP    
    for (let i = 0; i < nums.length; i++) {
       if(MAP.has(target-nums[i])){
            return [MAP.get(target-nums[i]),i]
        };
        MAP.set(nums[i],i);
    }
};

771. 宝石与石头

  • Set 和 Map 主要的应用场景在于 数据重组 和 数据储存。
  • Set 是一种叫做集合的数据结构,Map 是一种叫做字典的数据结构。
  • 共同点:集合、字典 可以储存不重复的值
  • 不同点:集合 是以 [value, value]的形式储存元素,字典 是以 [key, value] 的形式储存
  • var numJewelsInStones = function(jewels, stones) {
       const set = new Set(jewels.split(''));
        var num = 0;
        for (let i of stones){
             if(set.has(i)){num++} ;
        }
       return num;
    };
stringObject.split(separator,howmany)
separator必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

如果把空字符串 ("") 用作 separator,那么 stringObject 中的每个字符之间都会被分割。

返回值

一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。

但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

136. 只出现一次的数字

var singleNumber = function(nums) {
    var set = new Set();
    for(let i of nums){
        if(set.has(i)){set.delete(i);}
        else{set.add(i);}       
    }
    return [...set][0];
};

神奇数学解法

var singleNumber = function(nums) {
   var ans = 0;
    for(let i of nums){
     ans ^=i;
    }
    return ans;
};

满足交换结合律 

一个数和 0 做 XOR 运算等于本身:a⊕0 = a
一个数和其本身做 XOR 运算等于 0:a⊕a = 0
XOR 运算满足交换律和结合律:a⊕b⊕a = (a⊕a)⊕b = 0⊕b = b

202. 快乐数

当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。

判断有没有重复

var isHappy = function(n) {
    const set = new Set();
    var nums=n;
    while(true){
       const num = `${nums}`;
       var len = num.length;
       var sum=0;
       for(let i=0;i<len;i++){
          sum+=Math.pow(Number(num[i]), 2);
       }
       if (sum==1) return true;
       if(set.has(sum)) return false;
       set.add(sum);
       nums = sum;
    }
};

 const num = `${nums}`;将数字分开

或者将数字转变为字符串,

let n = '123456789'
let sum = 0
for (let i of n) { 
    sum += ( i * i )
}

前端灵魂画师🎨图解快慢指针 - 快乐数 - 力扣(LeetCode) (leetcode-cn.com)

快慢指针的解法,很多题的总结。链表数据结构和判断循环, 利用快慢指针创造的差值, 可节省内存空间, 减少计算次数

463. 岛屿的周长
自己想出来的,先看每行相连的1,再看每列相连的1,这都是重复的边需要剪掉。

var isnum = function(grid){
    var rowlen = grid.length;
    var collen = grid[0].length;
    var sum=0;
    var num=0;
    for(let j=0;j<rowlen;j++){
        for(let i=0;i<collen;i++){
            if(grid[j][i]==1){
                sum++;
                if(grid[j][i]==grid[j][i+1]){num++;}}
        }
    }
    return [sum,num];
}
var islandPerimeter = function(grid) {
    var newArray = grid[0].map(function (col, i) {
       return grid.map(function (row) {
           return row[i];
       })
  });
    return isnum(grid)[0]*4-2*(isnum(grid)[1]+isnum(newArray)[1]) 
};

二维数组转置,背。

var newArray = grid[0].map(function (col, i) {
       return grid.map(function (row) {
           return row[i];
       })
  });

其实不用转置,比较列和列+1即可,但要注意有+1范围。运行时间略长。

var islandPerimeter = function(grid) {
    var rowlen = grid.length;
    var collen = grid[0].length;
    var sum=0;
    var num=0;
    for(let j=0;j<rowlen;j++){
        for(let i=0;i<collen;i++){
            if(grid[j][i]==1){
                sum++;
                if(i<collen-1&&grid[j][i+1]==1){num++;}
                if(j<rowlen-1&&grid[j+1][i]==1){num++;}
                }
        }
    }
    return sum*4-2*num;
};

还可以找四周是海的边数

219. 存在重复元素 II

217. 存在重复元素

349. 两个数组的交集

242. 有效的字母异位词

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值