Leetcode 第 385 场周赛题解

news2024/11/17 5:37:22

Leetcode 第 385 场周赛题解

  • Leetcode 第 385 场周赛题解
    • 题目1:3042. 统计前后缀下标对 I
      • 思路
      • 代码
      • 复杂度分析
    • 题目2:3043. 最长公共前缀的长度
      • 思路
      • 代码
      • 复杂度分析
    • 题目3:3044. 出现频率最高的质数
      • 思路
      • 代码
      • 复杂度分析
    • 题目4:3045. 统计前后缀下标对 II
      • 思路
      • 代码
      • 复杂度分析

Leetcode 第 385 场周赛题解

题目1:3042. 统计前后缀下标对 I

思路

暴力枚举下标为 i 和 j 的字符串 words[i] 和 words[j],当满足条件:

words[i] == words[j].substr(0, words[i].size()) && words[i] == words[j].substr(words[j].size() - words[i].size()) 时,

计数器 count++,最后返回 count。

代码

/*
 * @lc app=leetcode.cn id=3042 lang=cpp
 *
 * [3042] 统计前后缀下标对 I
 */

// @lc code=start
class Solution
{
public:
    int countPrefixSuffixPairs(vector<string> &words)
    {
        if (words.empty())
            return 0;

        int n = words.size(), count = 0;
        for (int i = 0; i < n - 1; i++)
            for (int j = i + 1; j < n; j++)
            {
                int len1 = words[i].size(), len2 = words[j].size();
                if (len1 <= len2)
                    if (words[i] == words[j].substr(0, len1) &&
                        words[i] == words[j].substr(len2 - len1))
                        count++;
            }
        return count;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(n2),其中 n 是数组 words 的元素个数。

空间复杂度:O(1)。

题目2:3043. 最长公共前缀的长度

思路

数字不好比较前缀,把它们转换成字符串再进行比较。

将数组 arr1 的元素的所有前缀插入到一个字符串集合 strSet 中,遍历数组 arr2 的元素 x,转换成字符串 s,取 s 的前缀在集合中搜索,若找到,更新最长公共前缀的长度。

最后返回最大值即可。

代码

/*
 * @lc app=leetcode.cn id=3043 lang=cpp
 *
 * [3043] 最长公共前缀的长度
 */

// @lc code=start
class Solution
{
public:
    int longestCommonPrefix(vector<int> &arr1, vector<int> &arr2)
    {
        set<string> strSet;
        for (int &x : arr1)
        {
            string s = to_string(x);
            for (int i = 1; i <= s.length(); i++)
                strSet.insert(s.substr(0, i));
        }

        int ans = 0;
        for (int &x : arr2)
        {
            string s = to_string(x);
            for (int len = 1; len <= s.length(); len++)
            {
                string temp = s.substr(0, len);
                if (strSet.count(temp))
                    ans = max(ans, len);
            }
        }

        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O((n+m)log2U),,其中 n 为数组 arr1 的长度,m 为数组 arr2 的长度,U 为数组元素的最大值。

空间复杂度:O(nlog2U),,其中 n 为数组 arr1 的长度,U 为数组元素的最大值。

题目3:3044. 出现频率最高的质数

思路

对于每个单元格,枚举八个方向,生成数字,用一个哈希表统计其中质数个数。

最后返回出现次数最多的质数,如果有多个这样的质数,返回最大的那个。

代码

/*
 * @lc app=leetcode.cn id=3044 lang=cpp
 *
 * [3044] 出现频率最高的质数
 */

// @lc code=start
class Solution
{
private:
    const int dx[8] = {-1, -1, -1, 1, 1, 1, 0, 0};
    const int dy[8] = {0, -1, 1, 0, -1, 1, -1, 1};

public:
    int mostFrequentPrime(vector<vector<int>> &mat)
    {
        if (mat.empty())
            return 0;

        int m = mat.size(), n = m ? mat[0].size() : 0;

        unordered_map<int, int> cnt;
        for (int i = 0; i < m; i++)
            for (int j = 0; j < n; j++)
                for (int k = 0; k < 8; k++)
                {
                    int r = i + dx[k], c = j + dy[k], v = mat[i][j];
                    // 只统计大于 10 的质数
                    // if (isPrime(v))
                    //     cnt[v]++;
                    while (r >= 0 && r < m && c >= 0 && c < n)
                    {
                        v = 10 * v + mat[r][c];
                        if (isPrime(v))
                            cnt[v]++;
                        r += dx[k];
                        c += dy[k];
                    }
                }

        int ans = -1, maxCount = 0;
        for (auto &[num, count] : cnt)
        {
            if (count > maxCount)
            {
                ans = num;
                maxCount = count;
            }
            else if (count == maxCount)
                ans = max(ans, num);
        }
        return ans;
    }
    // 辅函数 - 判断数字 n 是否是质数
    bool isPrime(int n)
    {
        for (int i = 2; i * i <= n; i++)
        {
            if (n % i == 0)
                return false;
        }
        return true;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(mnk*10k/2),其中 m 和 n 分别为 mat 的行数和列数,k=max(m,n)。总共有 O(mnk) 个数,判断质数需要 O(10k/2) 的时间。

空间复杂度:O(mnk),其中 m 和 n 分别为 mat 的行数和列数,k=max(m,n)。

题目4:3045. 统计前后缀下标对 II

思路

在这里插入图片描述

将这个列表哈希化:idx = (s[i] - ‘a’) * 26 + (s[j] - ‘a’)。

枚举 t=words[j],怎么统计有多少个 s=words[i] 是 t 的前缀?

这可以用字典树解决,在遍历 words 的同时,维护每个字符串的出现次数。当我们遍历 t 时,同时遍历字典树上的对应节点,并把 t 插入字典树。

代码

/*
 * @lc app=leetcode.cn id=3045 lang=cpp
 *
 * [3045] 统计前后缀下标对 II
 */

// @lc code=start

// 字典树

class Solution
{
public:
    struct Trie
    {
        unordered_map<int, Trie *> childs;
        int cnt = 0;
    };
    Trie *trie = new Trie();
    void add(const string &s)
    {
        Trie *cur = trie;
        int n = s.size();
        for (int i = 0, j = n - 1; i < n; ++i, --j)
        {
            int idx = (s[i] - 'a') * 26 + (s[j] - 'a');
            if (!cur->childs.count(idx))
            {
                cur->childs[idx] = new Trie();
            }
            cur = cur->childs[idx];
            cur->cnt += 1;
        }
    }
    int query(const string &s)
    {
        Trie *cur = trie;
        int n = s.size();
        for (int i = 0, j = n - 1; i < n; ++i, --j)
        {
            int idx = (s[i] - 'a') * 26 + (s[j] - 'a');
            if (!cur->childs.count(idx))
                return 0;
            cur = cur->childs[idx];
        }
        return cur->cnt;
    }
    long long countPrefixSuffixPairs(vector<string> &words)
    {
        int n = words.size();
        long long ans = 0;
        for (int i = n - 1; i >= 0; --i)
        {
            ans += query(words[i]);
            add(words[i]);
        }
        return ans;
    }
};
// @lc code=end

复杂度分析

时间复杂度:O(L),其中 L 为所有 words[i] 的长度之和。

空间复杂度:O(L),其中 L 为所有 words[i] 的长度之和。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1476579.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【网络那些事】

【云计算】 云计算&#xff1a;把计算资源放在某个地方&#xff0c;并通过互联网暴露出来&#xff0c;让用户可以按需使用计算资源的方式&#xff0c;就是所谓的云计算 云计算的三种服务&#xff1a; 云平台专业名词 日常叫法 亚马逊云叫法 云服务器 ECS &#xff08;Elas…

鸿运(通天星CMSV6车载)主动安全监控云平台敏感信息泄露漏洞

文章目录 前言声明一、系统简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 鸿运主动安全监控云平台实现对计算资源、存储资源、网络资源、云应用服务进行7*24小时全时区、多地域、全方位、立体式、智能化的IT运维监控&#xff0c;保障IT系统安全、稳定、可靠运行…

Java多线程算法总结

1. 标题三个线程同时运行&#xff0c;依次打印ABC&#xff0c;一共打印10次 算法代码如下&#xff1a; public class ThreadTest {private Object oa new Object();private Object ob new Object();private Object oc new Object();private static final String TAG &quo…

Tomcat架构分析

Tomcat的核心组件 Tomcat将请求器和处理器分离&#xff0c;使用多种请求器支持不同的网络协议&#xff0c;而处理器只有一个。从而网络协议和容器解耦。 Tomcat的容器 Host&#xff1a;Tomcat提供多个域名的服务&#xff0c;其将每个域名都视为一个虚拟的主机&#xff0c;在…

面试笔记系列四之SpringBoot+SpringCloud基础知识点整理及常见面试题

什么是 Spring Boot&#xff1f; Spring Boot 是 Spring 开源组织下的子项目&#xff0c;是 Spring 组件一站式解决方案&#xff0c;主要是简化了使用 Spring 的难度&#xff0c;简省了繁重的配置&#xff0c;提供了各种启动器&#xff0c;开发者能快速上手。 Spring Boot 有哪…

Stable-Diffusion ubuntu服务器部署,报错解决方法(小白教程)

Stable Diffusion是一个深度学习模型&#xff0c;专注于生成高质量的图像。它由CompVis团队与Stability AI合作开发&#xff0c;并在2022年公开发布。这个模型使用文本提示&#xff08;text prompts&#xff09;生成详细、逼真的图像&#xff0c;是目前人工智能图像生成领域的一…

浅谈 Linux 网络编程 socket

文章目录 socket 介绍 socket 介绍 socket 被翻译成 网络套接字&#xff0c;这个名字实在是不好理解&#xff0c;我更愿意称为"插槽"。 忽略 socket 的中文名&#xff0c;先无脑记住两个规则&#xff1a; ① 记住&#xff0c;一个文件描述符(fd) 指向一个 socket&…

队列的概念及使用

目录 一. 概念 二. 队列的使用 三. 队列模拟实现 四. 循环队列 五. 面试题 一. 概念 队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c;队列具有先进先出 FIFO(First In First Out) 入队列&#xff1a;进行插入操…

xss过waf的小姿势

今天看大佬的视频学到了几个操作 首先是拆分发可以用self将被过滤的函数进行拆分 如下图我用self将alert拆分成两段依然成功执行 然后学习另一种姿势 <svg id"YWxlcnQoIlhTUyIp"><img src1 οnerrοr"window[eval](atob(document.getElementsByTagNa…

【低代码开发_RuoYi_框架】RuoYi框架_前端页面部署/搭建

开源软件的影响力 随着信息技术的快速发展&#xff0c;开源软件已经成为软件开发的趋势&#xff0c;并产生了深远的影响。开源软件的低成本、可协作性和透明度等特点&#xff0c;使得越来越多的企业和个人选择使用开源软件&#xff0c;促进了软件行业的繁荣。然而&#xff0c;…

vue2+elementui上传照片(el-upload 超简单)

文章目录 element上传附件&#xff08;el-upload 超详细&#xff09;代码展示html代码data中methods中接口写法 总结 element上传附件&#xff08;el-upload 超详细&#xff09; 这个功能其实比较常见的功能&#xff0c;后台管理系统基本上都有&#xff0c;这就离不开element的…

华为OD技术面试案例3-2024年

技术一面&#xff1a; 1.手撕代码&#xff0c;算法题&#xff1a; 【最小路径和】 手撕代码通过&#xff0c;面试官拍了照片 2.深挖项目&#xff0c;做过的自认为最好的一个项目&#xff0c;描述做过的项目的工作过程&#xff0c;使用到哪些技术&#xff1f; 技术二面&…

高压高能碳陶瓷无感电阻的制作以及应用?

由于现有需求&#xff0c;许多现代电子电路和设备都会经历瞬态脉冲和浪涌。这反过来又导致需要“设计”瞬态浪涌保护&#xff0c;尤其是在电机控制器等电路中。当电机启动时&#xff0c;此时消耗的电流过大&#xff0c;可能导致电阻器故障。同样&#xff0c;如果电容器用于电机…

【MySQL】基于Docker搭建MySQL一主二从集群

本文记录了搭建mysql一主二从集群&#xff0c;这样的一个集群master为可读写&#xff0c;slave为只读。过程中使用了docker&#xff0c;便于快速搭建单体mysql。 1&#xff0c;准备docker docker的安装可以参考之前基于yum安装docker的文章[1]。 容器相关命令[2]。 查看正在…

加密与安全_探索常用编码算法

文章目录 概述什么是编码编码分类ASCII码 &#xff08;最多只能有128个字符&#xff09;Unicode &#xff08;用于表示世界上几乎所有的文字和符号&#xff09;URL编码 &#xff08;解决服务器只能识别ASCII字符的问题&#xff09;实现&#xff1a;编码_URLEncoder实现&#xf…

机器人内部传感器阅读梳理及心得-速度传感器-模拟式速度传感器

速度传感器是机器人内部传感器之一&#xff0c;是闭环控制系统中不可缺少的重要组成部分&#xff0c;它用来测量机器人关节的运动速度。可以进行速度测量的传感器很多&#xff0c;如进行位置测量的传感器大多可同时获得速度的信息。但是应用最广泛、能直接得到代表转速的电压且…

【大数据架构(2)】kappa架构介绍

文章目录 一. Kappa架构1. Speed Layer (Stream Layer) - The Foundation of Kappa Architecture2. Stream Processing: The Heart of Kappa Architecture 二. Benefits of Kappa and Streaming Architecture1. Simplicity and Streamlined Pipeline2. High-Throughput Process…

4_相机透镜畸变

理论上讲&#xff0c;是可能定义一种透镜而不引入任何畸变的。然而现实世界没有完美的透镜。这主要是制造上的原因&#xff0c;因为制作一个“球形”透镜比制作一个数学上理想的透镜更容易。而且从机械方面也很难把透镜和成像仪保持平行。下面主要描述两种主要的透镜畸变并为他…

[vscode] 1. 在编辑器的标签页下显示文件目录(标签页显示面包屑) 2. 在标题栏上显示当前文件的完整路径

1. 标签页显示面包屑 view->Appearance->Breadcrumbs 2. 在标题栏上显示当前文件的完整路径 搜索 window.title将原来的值activeEditorShort 修改为 activeEditorMedium 参考&#xff1a; vscode在编辑器的标签页下显示文件目录&#xff08;标签页显示面包屑&#xf…

Laravel - API 项目适用的图片验证码

1. 安装 gregwar/captcha 图片验证码接口的流程是&#xff1a; 生成图片验证码 生成随机的 key&#xff0c;将验证码文本存入缓存。 返回随机的 key&#xff0c;以及验证码图片 # 不限于 laravel 普通 php 项目也可以使用额 $ composer require gregwar/captcha2. 开发接口 …