954. 二倍数对数组
每日一题,开始的思路是遍历每一个数,如果这个数的两倍和这个数的1/2都不在数组中,则返回false,否则true,但未考虑如[1,2,4,4,8,16]这种情况,于是需要用map存储每个元素的个数
var canReorderDoubled = function(arr) {
arr.sort((a,b)=>a-b)
let keyNums=new Map()
for(let i=0;i<arr.length;i++){
keyNums.set(arr[i],keyNums.get(arr[i])?keyNums.get(arr[i])+1:1)
}
for(let i=0;i<arr.length;i++){
if(keyNums.has(arr[i]) && keyNums.has(arr[i]*2)){
if(keyNums.get(arr[i])>0 && keyNums.get(arr[i]*2)>0){
keyNums.set(arr[i],keyNums.get(arr[i])-1)
keyNums.set(arr[i]*2,keyNums.get(arr[i]*2)-1)
}
}
}
//forEach()中的return只会结束此次循环,执行下一次循环,无效
let res=true
keyNums.forEach(value=>{
if(value>0){
res= false
}
})
return res
};
剑指 Offer 03. 数组中重复的数字
排序后遍历
var findRepeatNumber = function(nums) {
nums.sort((a,b)=>a-b)
for(let i=0;i<nums.length-1;i++){
if(nums[i]===nums[i+1]){
return nums[i]
}
}
};
剑指 Offer 04. 二维数组中的查找
var findNumberIn2DArray = function(matrix, target) {
if(!matrix.length) return false;
//以左下角为原点建立坐标轴
//current<target,右移
//current>target,上移
let x = matrix.length - 1, y = 0;
while(x >= 0 && y < matrix[0].length){
if(matrix[x][y] === target){
return true;
}else if(matrix[x][y] > target){
x--;
}else{
y++;
}
}
return false;
};