第 361 场 LeetCode 周赛题解

news2025/1/20 14:48:37

A 统计对称整数的数目

在这里插入图片描述

枚举 x x x

class Solution {
public:
    int countSymmetricIntegers(int low, int high) {
        int res = 0;
        for (int i = low; i <= high; i++) {
            string s = to_string(i);
            if (s.size() & 1)
                continue;
            int s1 = 0, s2 = 0;
            for (int k = 0; k < s.size(); k++)
                if (k < s.size() / 2)
                    s1 += s[k] - '0';
                else
                    s2 += s[k] - '0';
            if (s1 == s2)
                res++;
        }
        return res;
    }
};

B 生成特殊数字的最少操作

在这里插入图片描述

双指针:则若字符串操作完后为 0 0 0 ,设字符串长为 n n n ,则需要 n n n n − 1 n-1 n1 (字符串中含 0)操作使得字符串变为 0 0 0 , 若字符串操作完后至少有两位数字,则其最后两位只能是 { 25 , 50 , 75 , 00 } \{25, 50, 75, 00\} {25,50,75,00} 其中之一,枚举可能的后两位,用双指针计算要得到当前枚举值的最少操作数

class Solution {
public:
    int minimumOperations(string num) {
        vector<string> tar{"25", "50", "75", "00"};
        int n = num.size();
        int res = num.find('0') == num.npos ? n : n - 1;
        for (auto &s: tar) {
            int i = s.size() - 1;
            int j = n - 1;
            int cur = 0;//得到当前枚举值的最少操作数
            for (; i >= 0 && j >= 0;) {
                if (s[i] == num[j]) {
                    i--;
                    j--;
                } else {
                    j--;
                    cur++;
                }
            }
            if (i < 0)
                res = min(res, cur);
        }
        return res;
    }
};

C 统计趣味子数组的数目

在这里插入图片描述
在这里插入图片描述

前缀和:设数组 l i li li 有: l i i = { 1 , n u m s [ i ] % m o d = k 0 , n u m s [ i ] % m o d ≠ k li_i=\left\{\begin{matrix} 1 & , nums[i]\%mod=k \\ 0 & , nums[i]\%mod\ne k \end{matrix}\right. lii={10,nums[i]%mod=k,nums[i]%mod=k,设 l i li li 上的前缀和为 p s i = ( ∑ j = 0 j < i l i i ) % m o d ps_i=(\sum_{j=0}^{j<i} li_i)\%mod psi=(j=0j<ilii)%mod ,设子数组 n u m s [ l , r ] nums[l,r] nums[l,r] 为趣味子数组,则有: ( p s r + 1 − p s l ) % m o d = k (ps_{r+1}-ps_{l})\%mod=k (psr+1psl)%mod=k,即有 p s l = ( ( p s r + 1 − k ) % m o d + m o d ) % m o d ps_l=((ps_{r+1}-k)\%mod+mod)\%mod psl=((psr+1k)%mod+mod)%mod

class Solution {
public:
    using ll = long long;

    long long countInterestingSubarrays(vector<int> &nums, int modulo, int k) {
        unordered_map<int, ll> cnt;//cnt[val]: 前缀和val出现的次数
        cnt[0] = 1;//前缀为空
        int s = 0;//当前前缀和
        ll res = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] % modulo == k)
                s = (s + 1) % modulo;
            int s_l = ((s - k) % modulo + modulo) % modulo;
            res += cnt[s_l];
            cnt[s]++;
        }
        return res;
    }
};

D 边权重均等查询

在这里插入图片描述
在这里插入图片描述

倍增+枚举:1)预处理:设 0 0 0 为树的根节点,枚举边的权重 w _ i d w\_id w_id,从树根开始 d f s dfs dfs ,计算各节点 u u u 到树根的路径上的边数 l e v e l [ u ] level[u] level[u],以及节点 u u u 到树根的路径上边权重为 w _ i d w\_id w_id 的边的数目 s [ u ] [ w _ i d ] s[u][w\_id] s[u][w_id],求倍增数组 p p p p [ u ] [ j ] p[u][j] p[u][j]为与 u u u 距离为 2 j 2^j 2j的祖先节点。2)对一个查询 ( a , b ) (a,b) (a,b),用倍增的方式求 a a a b b b 的最近公共祖先 c c c ,然后枚举 w _ i d w\_id w_id ,将 a a a b b b 间路径上的边的边权统一为 w _ i d w\_id w_id 的操作数为: ( l e v e l [ a ] − l e v e l [ c ] − ( s [ a ] [ w _ i d ] − s [ c ] [ w _ i d ] ) ) + ( l e v e l [ b ] − l e v e l [ c ] − ( s [ b ] [ w _ i d ] − s [ c ] [ w _ i d ] ) ) \left ( level[a] - level[c] - (s[a][w\_id] - s[c][w\_id]) \right ) + \left ( level[b] - level[c] - (s[b][w\_id] - s[c][w\_id]) \right ) (level[a]level[c](s[a][w_id]s[c][w_id]))+(level[b]level[c](s[b][w_id]s[c][w_id]))

class Solution {
public:
    vector<int> minOperationsQueries(int n, vector<vector<int>> &edges, vector<vector<int>> &queries) {
        vector<pair<int, int>> e[n];//邻接表
        int mx_w = 0, mn_w = INT32_MAX;//最大权重、最小权重
        for (auto &ei: edges) {
            e[ei[0]].emplace_back(ei[1], ei[2]);
            e[ei[1]].emplace_back(ei[0], ei[2]);
            mx_w = max(mx_w, ei[2]);
            mn_w = min(mn_w, ei[2]);
        }
        int level[n], s[n][27];
        int p[n][15];
        function<void(int, int, int, int, int)> dfs = [&](int cur, int par, int lev, int sum, int w_id) {
            if (w_id == mn_w)//倍增数组一轮dfs即可计算
                for (int i = 0; i < 15; i++)
                    p[cur][i] = i != 0 ? p[p[cur][i - 1]][i - 1] : par;
            level[cur] = lev;
            s[cur][w_id] = sum;
            for (auto &[j, w]: e[cur])
                if (j != par)
                    dfs(j, cur, lev + 1, w == w_id ? sum + 1 : sum, w_id);

        };
        for (int i = mn_w; i <= mx_w; i++)//枚举w_id
            dfs(0, 0, 0, 0, i);

        vector<int> res;
        res.reserve(queries.size());
        for (auto &qi: queries) {
            int a = qi[0], b = qi[1];
            if (a == b) {
                res.push_back(0);
                continue;
            }
            if (level[a] < level[b])
                swap(a, b);
            int c = a;//c最终为a和b的最近公共祖先
            for (int step = level[a] - level[b], ind = 0; step >= (1 << ind); ind++)
                if (step >> ind & 1)
                    c = p[c][ind];
            if (c != b) {
                int b_ = b;
                for (int ind = 14; ind >= 0; ind--) {
                    if (p[c][ind] != p[b_][ind]) {
                        c = p[c][ind];
                        b_ = p[b_][ind];
                    }
                }
                c = p[c][0];
            }
            int res_i = INT32_MAX;
            for (int w_id = mn_w; w_id <= mx_w; w_id++) {//枚举w_id
                int t1 = level[a] - level[c] - (s[a][w_id] - s[c][w_id]);
                int t2 = level[b] - level[c] - (s[b][w_id] - s[c][w_id]);
                res_i = min(res_i, t1 + t2);
            }
            res.push_back(res_i);
        }
        return res;
    }
};

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

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

相关文章

快速为RPG辅助工具MTool增加更多快捷键(一键保存等)

起源&#xff1a;MTool是个好工具&#xff0c;本身固然好用&#xff0c;但是它本身的快捷键功能很少&#xff0c;虽然内置了一个录制工具&#xff0c;但是一个个的录&#xff0c;又麻烦&#xff0c;一般人也难以掌握 本文用快速方法增加更多快捷键&#xff0c;可以做到一键保存…

利用非线性解码模型从人类听觉皮层的活动中重构音乐

音乐是人类体验的核心&#xff0c;但音乐感知背后的精确神经动力学仍然未知。本研究分析了29名患者的独特颅内脑电图(iEEG)数据集&#xff0c;这些患者听了Pink Floyd的歌曲&#xff0c;并应用了先前在语音领域使用的刺激重建方法。本研究成功地从直接神经录音中重建了可识别的…

【性能优化】聊聊性能优化那些事

针对于互联网应用来说&#xff0c;性能优化其实就是一直需要做的事情&#xff0c;因为系统响应慢&#xff0c;是非常影响用户的体验&#xff0c;可能回造成用户流失。所以对于性能非常重要。最近正好接到一个性能优化的需求&#xff0c;需要对所负责的系统进行性能提升。目前接…

Python自动化小技巧22——获取中国高校排名数据

背景 【软科排名】2023年最新软科中国大学排名|中国最好大学排名 (shanghairanking.cn) 爬取这个网站所有的高校的数据&#xff0c;包括学习名称&#xff0c;层次&#xff0c;地区&#xff0c;分数等等信息&#xff1a;[办学层次,学科水平,办学资源,师资规模与结构,人才培养,…

红日靶场五(vulnstack5)渗透分析

环境搭建 win7 192.168.111.132&#xff08;仅主机&#xff09; 192.168.123.212&#xff08;桥接&#xff09; .\heart p-0p-0p-0win2008 ip: 192.168.111.131&#xff08;仅主机&#xff09; sun\admin 2020.comkali ip: 192.168.10.131&#xff08;nat&#xff09;vps&…

字节一面:说说地址栏输入 URL 敲下回车后发生了什么?

前言 最近博主在字节面试中遇到这样一个面试题&#xff0c;这个问题也是前端面试的高频问题&#xff0c;作为一名前端开发工程师&#xff0c;我们只有了解地址栏输入 URL 敲下回车后发生的事件&#xff0c;才知道性能优化如何下手&#xff0c;性能优化也是前端必备知识&#xf…

第一章_线程基础知识

先拜拜大神 Doug Lea&#xff08;道格.利&#xff09; java.util.concurrent在并发编程中使用的工具包 为什么学习并用好多线程极其重要 硬件方面 摩尔定律失效 摩尔定律&#xff1a;它是由英特尔创始人之一Gordon Moore&#xff08;戈登.摩尔&#xff09;提出来的。其内容为…

Centos 6.5 升级到Centos7指导手册

一、背景 某业务系统因建设较早&#xff0c;使用的OS比较过时&#xff0c;还是centos6.5的系统&#xff0c;因国产化需要&#xff0c;需将该系统升级到BClinux 8.6&#xff0c;但官方显示不支持centos 6.x升级到8&#xff0c;需先将centos6.5升级到centos7的最新版&#xff0c…

Python之作业(一)

Python之作业&#xff08;一&#xff09; 作业 打印九九乘法表 用户登录验证 用户依次输入用户名和密码&#xff0c;然后提交验证用户不存在、密码错误&#xff0c;都显示用户名或密码错误提示错误3次&#xff0c;则退出程序验证成功则显示登录信息 九九乘法表 代码分析 先…

【100天精通Python】Day52:Python 数据分析_Numpy入门基础与数组操作

目录 1 NumPy 基础概述 1.1 NumPy的主要特点和功能 1.2 NumPy 安装和导入 2 Numpy 数组 2.1 创建NumPy数组 2.2 数组的形状和维度 2.3 数组的数据类型 2.4 访问和修改数组元素 3 数组操作 3.1 数组运算 3.2 数学函数 3.3 统计函数 4 数组形状操作 4.1 重塑数组形…

Sentinel 流量控制框架

1. Sentinel 是什么&#xff1f; Sentinel是由阿里中间件团队开源的&#xff0c;面向分布式服务架构的轻量级高可用流量控制组件。 2. 主要优势和特性 轻量级&#xff0c;核心库无多余依赖&#xff0c;性能损耗小。 方便接入&#xff0c;开源生态广泛。 丰富的流量控制场景。 …

【C#】泛型

【C#】泛型 泛型是什么 泛型是将类型作为参数传递给类、结构、接口和方法&#xff0c;这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型&#xff0c;真正使用时再具体指定数据类型&#xff0c;以此来达到代码重用目的。 泛型特点 提高代码重用性一定…

ThreadLocal源码剖析(简单理解)

Thread部分源码 public class Thread implements Runnable {ThreadLocal.ThreadLocalMap threadLocals null; }ThreadLocal源码,其中ThreadLocal有一个静态内部类ThreadLocalMap,这个Map不是类似二叉树类型的,只是一个普通数组,其中具体使用什么算法其实我也不太理解. 然后对…

【LeetCode】剑指 Offer <二刷>(5)

目录 题目&#xff1a;剑指 Offer 10- II. 青蛙跳台阶问题 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 11. 旋转数组的最小数字 - 力…

MIPI D-PHY的初始化(MIPI Alliance Xilinx)

DPHY的基本介绍及使用已有很多文章&#xff0c;基本是基于《MIPI Alliance Specification for D-PHY 》的内容&#xff0c;学习时也以此为准&#xff0c;可参考CSDN上的文章。着重讲述MIPI D-PHY的初始化部分 1 D-PHY的功能及使用 下面的文章讲的不错&#xff0c;既有理论&…

内存管理方式

内存管理 一、C/C内存分布1、内存空间的介绍2、示例题目3、示例题目图解 二、C语言动态内存管理方式1、代码2、介绍 三、C内存管理方式1、概念2、代码3、代码所代表的意义 四、new和delete操作自定义类型1、代码2、运行结果3、特点 五、operator new与operator delete函数1、概…

【算法系列篇】模拟算法

文章目录 前言1.替换所有问号1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 提莫攻击2.1 题目要求2.2 做题思路2.3 Java代码实现 3. N 字形变换3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 外观数列4.1 题目要求4.2 做题思路4.3 Java代码实现 5. 数青蛙5.1 题目要求5.2 做题思…

CXL.mem S2M Message 释义

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

【操作系统】一文快速入门,很适合JAVA后端看

作者简介&#xff1a; 目录 1.概述 2.CPU管理 3.内存管理 4.IO管理 1.概述 操作系统可以看作一个计算机的管理系统&#xff0c;对计算机的硬件资源提供了一套完整的管理解决方案。计算机的硬件组成有五大模块&#xff1a;运算器、控制器、存储器、输入设备、输出设备。操作…

使用candump+grep查看CAN报文

在Linux系统中观察看CAN报文&#xff0c;我们一般使用candump&#xff0c;但是有时候会发现总线上CAN报文太多&#xff0c;例如开启了好几个PDO&#xff0c;这就导致想看的报文被夹杂到报文的海洋里&#xff0c;然后再去找&#xff0c;非常麻烦。 candump也提供了只观察某个报…