持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第18天,点击查看活动详情。
题目描述
给你一个整数数组 arr,请你检查是否存在两个整数 N 和 M,满足 N 是 M 的两倍(即,N = 2 * M)。
更正式地,检查是否存在两个下标 i 和 j 满足:
i != j
0 <= i, j < arr.length
arr[i] == 2 * arr[j]
来源:力扣(LeetCode)
- 示例1
输入: arr = [10,2,5,3]
输出: true
解释: N = 10 是 M = 5 的两倍,即 10 = 2 * 5 。
- 示例2
输入: arr = [7,1,14,11]
输出: true
解释: N = 14 是 M = 7 的两倍,即 14 = 2 * 7 。
- 示例3
输入: arr = [3,1,7,11]
输出: false
解释: 在该情况下不存在 N 和 M 满足 N = 2 * M 。
提示:
2 <= arr.length <= 500-10^3 <= arr[i] <= 10^3
思路分析
题目给出了一个整数数组,需要在这个数组里面找到两个元素,其中一个元素是另一个元素的两倍(只需要找到一堆即可,如果有多组那也可以);因为需要找找数组中的一个元素的两倍数,那我们就给出这个数组中所有元素的两倍数,也就是使用map方法将数组遍历一次,并将数组的元素数值乘以2,得出的新数组赋值给newArr,这样数组newArr里面的每个元素就是原数组的每个元素的两倍数,只要找到原数组里面有一个元素在这个newArr数组里面,就可以证明原数组有两倍数存在;接着循环原数组,在每次循环中判断循环到的元素是否有在newArr数组里面出现,若是出现就return true,否则不管;这里有个例外,若是元素等于0的时候,因为0的2倍数也是0,需要判断0出现的位置是否一致,若是不一致则可以return true.
AC代码
let num = [0,1,4,6,7,9,34];
function solution(arr) {
let newArr = arr.map( el => el * 2);
for(let i=0; i<arr.length; i++) {
if(arr[i] != 0){
if(newArr.includes(arr[i])) {
return true;
}
}else{
if(newArr.indexOf(arr[i]) !== i) {
return true;
}
}
}
return false;
}
solution(num);