首页 > 编程语言 >2748.力扣每日一题6/20 Java

2748.力扣每日一题6/20 Java

时间:2024-06-24 13:30:36浏览次数:37  
标签:10 cnt Java 数字 nums int 力扣 20 互质

题目
给你一个下标从 0 开始的整数数组 nums 。如果下标对 i、j 满足 0 ≤ i < j < nums.length ,如果 nums[i] 的 第一个数字 和 nums[j] 的 最后一个数字 互质 ,则认为 nums[i] 和 nums[j] 是一组 美丽下标对 。

返回 nums 中 美丽下标对 的总数目。

对于两个整数 x 和 y ,如果不存在大于 1 的整数可以整除它们,则认为 x 和 y 互质 。换而言之,如果 gcd(x, y) == 1 ,则认为 x 和 y 互质,其中 gcd(x, y) 是 x 和 y 的 最大公因数 。

示例 1

输入:nums = [2,5,1,4]
输出:5
解释:nums 中共有 5 组美丽下标对:
i = 0 和 j = 1 :nums[0] 的第一个数字是 2 ,nums[1] 的最后一个数字是 5 。2 和 5 互质,因此 gcd(2,5) == 1 。
i = 0 和 j = 2 :nums[0] 的第一个数字是 2 ,nums[2] 的最后一个数字是 1 。2 和 5 互质,因此 gcd(2,1) == 1 。
i = 1 和 j = 2 :nums[1] 的第一个数字是 5 ,nums[2] 的最后一个数字是 1 。2 和 5 互质,因此 gcd(5,1) == 1 。
i = 1 和 j = 3 :nums[1] 的第一个数字是 5 ,nums[3] 的最后一个数字是 4 。2 和 5 互质,因此 gcd(5,4) == 1 。
i = 2 和 j = 3 :nums[2] 的第一个数字是 1 ,nums[3] 的最后一个数字是 4 。2 和 5 互质,因此 gcd(1,4) == 1 。
因此,返回 5 。
示例 2

输入:nums = [11,21,12]
输出:2
解释:共有 2 组美丽下标对:
i = 0 和 j = 1 :nums[0] 的第一个数字是 1 ,nums[1] 的最后一个数字是 1 。gcd(1,1) == 1 。
i = 0 和 j = 2 :nums[0] 的第一个数字是 1 ,nums[2] 的最后一个数字是 2 。gcd(1,2) == 1 。
因此,返回 2 。

提示:

  • 2 <= nums.length <= 100
  • 1 <= nums[i] <= 9999
  • nums[i] % 10 != 0

解题思路

首先,我们需要明确题目要求的是找出数组中所有“美丽数对”的数量。一个“美丽数对”是指数组中的两个数 (x, y),其中 x 的最高位数字与 y 的个位数字互质(即最大公约数为1)。

为了高效地解决这个问题,我们可以使用一个数组 cnt 来记录每个数字作为最高位数字的出现次数。然后,对于数组 nums 中的每一个数 num,我们分别提取其最高位数字 firstDigit 和个位数字 lastDigit

  1. 提取个位数字:通过取余操作 num % 10 可以得到 num 的个位数字。
  2. 提取最高位数字:我们需要通过循环不断地将 num 除以10,直到 num 的值小于10,此时 num 就是原来的最高位数字。
  3. 检查互质关系:对于 lastDigit,我们遍历 cnt 数组,检查每个作为最高位数字的数字 i 是否与 lastDigit 互质(即 gcd(i, lastDigit) == 1)。如果互质且 cnt[i] > 0(即 i 作为最高位数字在数组中出现过),则我们将 cnt[i] 加到结果 ans 中,因为对于每一个这样的 i,都有 cnt[i] 个数与当前的 num 形成“美丽数对”。
  4. 更新计数数组:在遍历完 num 的所有相关操作后,我们将 firstDigit 的出现次数在 cnt 数组中加1。

代码实现:

class Solution {  
    public int countBeautifulPairs(int[] nums) {  
        int ans = 0;  
        int[] cnt = new int[10]; // 用于记录每个数字作为最高位数字的出现次数  
        for (int num : nums) {  
            int lastDigit = num % 10; // 提取个位数字  
            int temp = num;  
            while (temp >= 10) { // 提取最高位数字  
                temp /= 10;  
            }  
            int firstDigit = temp;  
  
            // 检查与个位数字互质的最高位数字的出现次数  
            for (int i = 1; i < 10; i++) {  
                if (cnt[i] > 0 && gcd(i, lastDigit) == 1) {  
                    ans += cnt[i];  
                }  
            }  
  
            // 更新最高位数字的出现次数  
            cnt[firstDigit]++;  
        }  
        return ans;  
    }  
  
    private int gcd(int a, int b) {  
        return b == 0 ? a : gcd(b, a % b);  
    }  
}

 

第二种解法

解题思路:

  1. 初始化
    • res 用于存储美丽对的总数,初始化为0。
    • cnt 是一个长度为10的数组,用于记录0到9这10个数字作为最高位数字在数组中出现的次数。注意,由于数字的最高位不可能是0(除非数字本身为0,但这种情况在这里被忽略了),所以实际上cnt[0]不会被使用。
  2. 遍历数组中的每个数字
    • 使用增强型for循环遍历输入数组nums中的每个数字x
  3. 检查个位数与每个可能的最高位数字是否互质
    • 使用内层循环遍历1到9的每个数字y
    • 计算x的个位数(x % 10)与y的最大公约数。
    • 如果最大公约数为1(即它们互质),则意味着x的个位数与某个数字的最高位y可以形成一个美丽对。因此,将cnt[y](即最高位为y的数字的个数)加到res
    • 提取最高位数字并更新计数
      • 我们可以使用另一个while循环来提取x的最高位数字。
      • 当提取到最高位数字后,增加cnt数组中对应位置的计数。
    • 返回结果
      • 返回计算得到的美丽对的总数res

哈希表

class Solution {
    public int countBeautifulPairs(int[] nums) {
        int res = 0;
        int[] cnt = new int[10];
        for (int x : nums) {
            for (int y = 1; y <= 9; y++) {
                if (gcd(x % 10, y) == 1) {
                    res += cnt[y];
                }
            }
            while (x >= 10) {
                x /= 10;
            }
            cnt[x]++;
        }
        return res;
    }

    private int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }
}

标签:10,cnt,Java,数字,nums,int,力扣,20,互质
From: https://blog.csdn.net/Rangsh/article/details/139843923

相关文章

  • Javascript高级程序设计(第四版)--学习记录之基本引用类型
    DateDate类型将日期保存为自协调世界时间1970年1月1日午夜至今所经过的毫秒数。创建日期对象letnow=newDate()Date.parse()方法接收一个表示日期的字符串参数,尝试将这个字符串转换为表示该日期的毫秒数。lettime=newDate(Date.parse("May24,2024"));Date.now()......
  • 力扣每日一题 6/24 模拟 数组 单调栈
    博客主页:誓则盟约系列专栏:IT竞赛专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞......
  • 中国车牌检测数据集VOC+YOLO格式2001张1类别
    数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):2001标注数量(xml文件个数):2001标注数量(txt文件个数):2001标注类别数:1标注类别名称:["plate"]每个类别标注的框数:plate框......
  • 【JavaScript脚本宇宙】浏览器中的文件系统:深入了解最受欢迎的JavaScript库
    超越传统存储:探索创新的浏览器文件系统解决方案前言在现代的网页开发中,文件系统和文件操作是不可或缺的一部分。无论是上传图片、下载文档还是在浏览器中保存离线数据,我们都需要与文件系统进行交互。为了简化这些任务并提供更好的用户体验,有许多JavaScript库被开发出来,以......
  • Java实现管线拓扑关系连通性分析
    管线拓扑关系的连通性分析通常涉及图论(GraphTheory)中的概念,特别是无向图(UndirectedGraph)的遍历算法,如深度优先搜索(DFS,Depth-FirstSearch)或广度优先搜索(BFS,Breadth-FirstSearch)。在管线拓扑中,管线可以被视为图的边(Edge),而管线的连接点可以被视为图的节点(Vertex)。连通性分析......
  • Java Script-使用DOM编程实现移动坦克
    要求:实现:将坦克图片放在页面上:<imgid="mytank"src="./img/right.png"/>在css中设置坦克的初始位置以及页面背景:<styletype="text/css">    input{font-size:26px;margin-top:20px;}    body{background-image:url("./img/gra......
  • 七、若依--P17--P18【黑马程序员Java最新AI+若依框架项目开发新方案视频教程,基于RuoYi
    学习视频【黑马程序员Java最新AI+若依框架项目开发新方案视频教程,基于RuoYi-Vue3前后端分离版本,从前端到后端再到AI智能化应用全通关】https://www.bilibili.com/video/BV1pf421B71v/?p=6&share_source=copy_web&vd_source=3949d51b57b2891ea14d6e51c792bef6二次开发P17:新......
  • CaiT(ICCV 2021,Meta)论文与代码解析
    paper:GoingdeeperwithImageTransformersofficialimplementation:https://github.com/facebookresearch/deitthird-partyimplementation:https://github.com/huggingface/pytorch-image-models/blob/main/timm/models/cait.py出发点这篇文章的研究重点是改进视觉Transfo......
  • JavaScript第十二讲:DOM编程“创建,删除,替换,插入节点”
    目录1.创建节点2.删除节点3.替换节点4.插入节点使用appendChild()使用insertBefore()深入解析与注意事项1.创建节点在HTMLDOM中,我们通常使用JavaScript的document.createElement()方法来创建元素节点,使用document.createTextNode()方法来创建文本节点。示例......
  • SSM-学情分析系统-56772(免费领源码+开发文档)可做计算机毕业设计JAVA、PHP、爬虫、APP
    学情分析系统摘 要随着科学技术的飞速发展,各行各业都在努力与现代先进技术接轨,通过科技手段提高自身的优势;对于学情分析系统当然也不能排除在外,随着网络技术的不断成熟,带动了学情分析系统,它彻底改变了过去传统的管理方式,不仅使服务管理难度变低了,还提升了管理的灵活性。这......