统计数组中相等且可以被整除的数对

100 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情

题目描述

给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k ,请你返回满足 0 <= i < j < n ,nums[i] == nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。
来源:力扣(LeetCode)

  • 示例 1
输入:nums = [3,1,2,2,2,1,3], k = 2
输出:4
解释:
总共有 4 对数符合所有要求:
- nums[0] == nums[6] 且 0 * 6 == 0 ,能被 2 整除。
- nums[2] == nums[3] 且 2 * 3 == 6 ,能被 2 整除。
- nums[2] == nums[4] 且 2 * 4 == 8 ,能被 2 整除。
- nums[3] == nums[4] 且 3 * 4 == 12 ,能被 2 整除。
  • 示例 1
输入: nums = [1,2,3,4], k = 1
输出: 0
解释: 由于数组中没有重复数值,所以没有数对 (i,j) 符合所有要求。

提示:

  • 1 <= nums.length <= 100
  • 1 <= nums[i], k <= 100

思路分析

根据题意可知,题目给出一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k;需要在这个数组nums中找出出现频率两次以上的元素,计算该元素前一次出现的下标和后一次出现的下标之积,两数之积若是能被k整除,那么就算一个,计算出这样的元素有几对。
这道题目相对来说是挺简单的一道题目,暴力循环加按规则计算即可得出结果。声明一个变量total储存数目,两次for循环这个数组,外层循环需要从下标0开始循环,内层循环就需要从外层循环的后一个开始,然后对比一下nums[i]和nums[j],下标i和下标j的乘积是否能被k整除,若是都满足,那么total就累加1。等循环结束total就是我们要的结果。

AC代码

function solution(nums, k) {
    let total = 0;
    for(let i=0; i<nums.length; i++) {
        for(let j=i+1; j<nums.length; j++) {
            if(nums[i] == nums[j] && i * j % k == 0) {
                total+=1;
            }
        }
    }
    console.log(total);
}
let nums = [3,1,2,2,2,1,3], k = 2
solution(nums, k);