华为OD算法复习3——哈希表 Javascript
这些力扣题目来源:AI推荐+karshey博主
目录
242.有效的字母异位词(通过)
javascript字符串没有sort方法,需要先转化成数组
两个数组也不能直接比较,必须用join("")方法变成字符串比较
s = "anagram", t = "nagaram"
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function(s, t) {
if(s.split("").sort().join("")==t.split("").sort().join("")) return true;
else return false;
};
console.log(isAnagram(s,t))
349.两个数组的交集(通过)
集合经常用来去重
取交集有现成的集合方法。此外:还有取并集、差集等其他方法
可以用[...元素]把可以遍历的数据结构转换成数组
nums1 = [1,2,2,1], nums2 = [2,2]
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @return {number[]}
*/
var intersection = function(nums1, nums2) {
let set_1 = new Set(nums1);
let set_2 = new Set(nums2)
return [...set_1.intersection(set_2)];
};
console.log(intersection(nums1,nums2));
202.快乐数 (通过)
把每次的循环计算结果存入一个数组里面 record
出现数字重复的时候可以打断循环
/**
* @param {number} n
* @return {boolean}
*/
var isHappy = function(n) {
let record = []
while(true){
if(n==1) return true;
if(record.indexOf(n)==-1)
record.push(n);
else
return false;
let temp = [];
while(n!=0){
temp.push(n%10);
n=Math.floor(n/10);
}
for(let i=0;i<temp.length;i++){
n+=temp[i]**2;
}
}
};
console.log(isHappy(19));
1. 两数之和(通过)
思路:先把和与第一个数的差存入字典(差值作为键、下标作为值)
然后重新遍历数组,如果下标对应的值在字典里面存在,说明现在的下标和存起来键对应的值是答案
注意:现在的下标和存起来对应的值不能相等。否则,证明两个数是同一位置
nums = [1,3,4,2], target = 6
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function(nums, target) {
let record={}
for(let i=0;i<nums.length;i++){
record[target-nums[i]] = i;
}
for(let j=0;j<nums.length;j++){
if(record[nums[j]] && j!=record[nums[j]]) return [j,record[nums[j]]]
}
};
console.log(twoSum(nums,target));
454.四数相加 II(通过)
思路:可以先把前面两个数和的相反数用字典存起来。如果是第一次出现数字就是1,如果不是第一次出现就在原基础上加1。
然后用双重循环遍历第三个和第四个数组的和。如果可以在字典里面找到相同的数字,那就把结果加在答案上。
/**
* @param {number[]} nums1
* @param {number[]} nums2
* @param {number[]} nums3
* @param {number[]} nums4
* @return {number}
*/
// nums1 = [1,2], nums2 = [-2,-1], nums3 = [-1,2], nums4 = [0,2]
// nums1 = [0], nums2 = [0], nums3 = [0], nums4 = [0]
nums1 = [-1,-1], nums2 = [-1,1], nums3 = [-1,1], nums4 = [1,-1]
var fourSumCount = function(nums1, nums2, nums3, nums4) {
let sum12 = {};
for(let i=0;i<nums1.length;i++){
for(let j=0;j<nums2.length;j++){
if(sum12[-(nums1[i]+nums2[j])])
sum12[-(nums1[i]+nums2[j])]+=1;
else
sum12[-(nums1[i]+nums2[j])]=1;
}
}
let count =0;
for(let i=0;i<nums3.length;i++){
for(let j=0;j<nums4.length;j++){
if(sum12[nums3[i]+nums4[j]]) count+=sum12[nums3[i]+nums4[j]];
}
}
return count;
};
console.log(fourSumCount(nums1,nums2,nums3,nums4));
15. 三数之和(通过)
思路:数组原来是没有顺序的,但是我们可以重新从小到大排序。这样不影响结果
有了顺序之后,每次固定最左边的值,移动两个指针即可(三数之和小于零时,左指针右移。反之,右指针左移。)
为了确保不重复,如果左指针或右指针下一个数和原来相同,需要多移动几次,直到值不相同。
最左边的值i,也同样可能重复,它可以和前面一个值比较,如果相同,也需要多移动几次。
nums = [-1,0,1,2,-1,-4]
/**
* @param {number[]} nums
* @return {number[][]}
*/
var threeSum = function(nums) {
nums.sort((a,b)=>a-b);
let ans=[];
for(let i=0;i<nums.length-2;i++){
//去重,nums[i]可能和nums[i+1]一样大
//有时候需要跳[-1,0,1]重复,有时候不需要跳过[-1,-1,2]不重复
if(i>0 &&nums[i]==nums[i-1]) continue;
let left=i+1;
let right=nums.length-1;
while(left<right){
sum=nums[i]+nums[left]+nums[right];
if(sum>0) {
while(nums[right]==nums[right-1]&&left<right) right--;
right--;
continue;
}
if(sum<0) {
while(nums[left]==nums[left+1]&&left<right) left++;
left++;
continue;
}
if(sum==0){
ans.push([nums[i],nums[left],nums[right]]);
while(nums[right]==nums[right-1]&&left<right) right--;
right--;
while(nums[left]==nums[left+1]&&left<right) left++;
left++;
}
}
}
// for(let i=0;i<ans.length;i++){
// console.log(ans[i]);
// }
return ans;
};
console.log(threeSum(nums));
18.四数之和(通过)
和三数之和思路相似,只不过开头固定前面两个数的和,左右指针移动剩下两个部分
nums = [1,0,-1,0,-2,2], target = 0
/**
* @param {number[]} nums
* @param {number} target
* @return {number[][]}
*/
var fourSum = function(nums, target) {
nums.sort((a,b)=>a-b);
let ans=[]
for(let i=0;i<nums.length-3;i++){
if(i>0&&nums[i]==nums[i-1]) continue;
for(let j=i+1;j<nums.length-2;j++){
if(j>i+1&&nums[j]==nums[j-1]) continue;
let left=j+1;
let right=nums.length-1;
while(left<right){
let sum=nums[i]+nums[j]+nums[left]+nums[right];
if(sum<target){
while(left<right&&nums[left]==nums[left+1])left++;
left++
continue
}
if(sum>target){
while(left<right&&nums[right]==nums[right-1])right--;
right--;
continue;
}
if(sum==target){
ans.push([nums[i],nums[j],nums[left],nums[right]]);
while(left<right&&nums[left]==nums[left+1])left++;
left++
while(left<right&&nums[right]==nums[right-1])right--;
right--;
}
}
}
}
// for(let i=0;i<ans.length;i++)
// console.log(ans[i])
return ans;
};
console.log(fourSum(nums,target));
题外话知识
两个独立的对象,哪怕长得一模一样,也永远不相等。
let a = { name: "Alice" }; let b = { name: "Alice" }; console.log(a === b); // false console.log(a == b); // false
JavaScript 对象比较的是 内存地址,不是内容。
更多推荐
所有评论(0)