不用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);
}
};
- 共同点:集合、字典 可以储存不重复的值
- 不同点:集合 是以 [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 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。
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
当我们遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法了。
判断有没有重复
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;
};
还可以找四周是海的边数