周赛355(模拟、贪心、DFS+位运算+问题转化)

news2024/12/23 3:55:52

文章目录

  • 周赛355
    • [2788. 按分隔符拆分字符串](https://leetcode.cn/problems/split-strings-by-separator/)
      • 模拟(注意转义)
    • [2789. 合并后数组中的最大元素](https://leetcode.cn/problems/largest-element-in-an-array-after-merge-operations/)
      • 贪心
    • [2790. 长度递增组的最大数目](https://leetcode.cn/problems/maximum-number-of-groups-with-increasing-length/)
    • [2791. 树中可以形成回文的路径数](https://leetcode.cn/problems/count-paths-that-can-form-a-palindrome-in-a-tree/)

周赛355

2788. 按分隔符拆分字符串

难度简单2

你一个字符串数组 words 和一个字符 separator ,请你按 separator 拆分 words 中的每个字符串。

返回一个由拆分后的新字符串组成的字符串数组,不包括空字符串

注意

  • separator 用于决定拆分发生的位置,但它不包含在结果字符串中。
  • 拆分可能形成两个以上的字符串。
  • 结果字符串必须保持初始相同的先后顺序。

示例 1:

输入:words = ["one.two.three","four.five","six"], separator = "."
输出:["one","two","three","four","five","six"]
解释:在本示例中,我们进行下述拆分:

"one.two.three" 拆分为 "one", "two", "three"
"four.five" 拆分为 "four", "five"
"six" 拆分为 "six" 

因此,结果数组为 ["one","two","three","four","five","six"] 。

示例 2:

输入:words = ["$easy$","$problem$"], separator = "$"
输出:["easy","problem"]
解释:在本示例中,我们进行下述拆分:

"$easy$" 拆分为 "easy"(不包括空字符串)
"$problem$" 拆分为 "problem"(不包括空字符串)

因此,结果数组为 ["easy","problem"] 。

示例 3:

输入:words = ["|||"], separator = "|"
输出:[]
解释:在本示例中,"|||" 的拆分结果将只包含一些空字符串,所以我们返回一个空数组 [] 。 

提示:

  • 1 <= words.length <= 100
  • 1 <= words[i].length <= 20
  • words[i] 中的字符要么是小写英文字母,要么就是字符串 ".,|$#@" 中的字符(不包括引号)
  • separator 是字符串 ".,|$#@" 中的某个字符(不包括引号)

模拟(注意转义)

class Solution {
    public List<String> splitWordsBySeparator(List<String> words, char separator) {
        List<String> ans = new ArrayList<>();
        for(String w : words){
            String[] strs = w.split("\\" + separator + "");
            for(String str : strs){
                if(str.length() > 0)
                    ans.add(str);
            }
        }
        return ans;
    }
}

2789. 合并后数组中的最大元素

难度中等5

给你一个下标从 0 开始、由正整数组成的数组 nums

你可以在数组上执行下述操作 任意 次:

  • 选中一个同时满足 0 <= i < nums.length - 1nums[i] <= nums[i + 1] 的整数 i 。将元素 nums[i + 1] 替换为 nums[i] + nums[i + 1] ,并从数组中删除元素 nums[i]

返回你可以从最终数组中获得的 最大 元素的值。

示例 1:

输入:nums = [2,3,7,9,3]
输出:21
解释:我们可以在数组上执行下述操作:
- 选中 i = 0 ,得到数组 nums = [5,7,9,3] 。
- 选中 i = 1 ,得到数组 nums = [5,16,3] 。
- 选中 i = 0 ,得到数组 nums = [21,3] 。
最终数组中的最大元素是 21 。可以证明我们无法获得更大的元素。

示例 2:

输入:nums = [5,3,3]
输出:11
解释:我们可以在数组上执行下述操作:
- 选中 i = 1 ,得到数组 nums = [5,6] 。
- 选中 i = 0 ,得到数组 nums = [11] 。
最终数组中只有一个元素,即 11 。

提示:

  • 1 <= nums.length <= 105
  • 1 <= nums[i] <= 106

贪心

从最后开始合并,当前大于等于前面 都能合并

因此,我们考虑以每个数为结尾,往前合并构成的最长区间,则这样的区间是不相交的,要么包含,要么分离(否则结束点更晚的区间总能合并到更前面的区间的开头)。

于是,我们只需要把数组进行分组,求每一组和的最大值。

由于是从后往前合并,因此只需要从后往前遍历数组即可。

class Solution {
    public long maxArrayValue(int[] nums) {
        int n = nums.length;
        long ans = nums[n-1], cur = nums[n-1];
        for(int i = n-2; i >= 0; i--){
            if(nums[i] <= cur){
                cur += nums[i];
                ans = Math.max(ans, cur);
            }else{
                cur = nums[i];
                ans = Math.max(ans, cur);
            }
        }
        return ans;
    }
}

2790. 长度递增组的最大数目

难度困难15

给你一个下标从 0 开始、长度为 n 的数组 usageLimits

你的任务是使用从 0n - 1 的数字创建若干组,并确保每个数字 i所有组 中使用的次数总共不超过 usageLimits[i] 次。此外,还必须满足以下条件:

  • 每个组必须由 不同 的数字组成,也就是说,单个组内不能存在重复的数字。
  • 每个组(除了第一个)的长度必须 严格大于 前一个组。

在满足所有条件的情况下,以整数形式返回可以创建的最大组数。

示例 1:

输入:usageLimits = [1,2,5]
输出:3
解释:在这个示例中,我们可以使用 0 至多一次,使用 1 至多 2 次,使用 2 至多 5 次。
一种既能满足所有条件,又能创建最多组的方式是: 
组 1 包含数字 [2] 。
组 2 包含数字 [1,2] 。
组 3 包含数字 [0,1,2] 。 
可以证明能够创建的最大组数是 3 。 
所以,输出是 3 。 

示例 2:

输入:usageLimits = [2,1,2]
输出:2
解释:在这个示例中,我们可以使用 0 至多 2 次,使用 1 至多 1 次,使用 2 至多 2 次。
一种既能满足所有条件,又能创建最多组的方式是: 
组 1 包含数字 [0] 。 
组 2 包含数字 [1,2] 。
可以证明能够创建的最大组数是 2 。 
所以,输出是 2 。 

示例 3:

输入:usageLimits = [1,1]
输出:1
解释:在这个示例中,我们可以使用 0 和 1 至多 1 次。 
一种既能满足所有条件,又能创建最多组的方式是:
组 1 包含数字 [0] 。
可以证明能够创建的最大组数是 1 。 
所以,输出是 1 。 

提示:

  • 1 <= usageLimits.length <= 105
  • 1 <= usageLimits[i] <= 109

题解:

倒序填入列,先递增排序保证了同一行的数不会重复,再使用剩余量计算出列个数,得到最终答案

class Solution {
    /**
         * 先对usageLimits排序
         * 贪心,每新增一个group, 最优的策略:group[i + 1].size() = group[i].size() + 1;
         * 从小到大遍历usageLimits, 每新增一个group, 必须要新增一个元素, 
         * 且 新增元素值 和 缓存未用完的值 必须要大于当前分组的值。若满足,说明可以新增一个group,未使用完的值加入缓存。
         * 
         * 举例说明:[2, 2, 2]
         * group[0]: 0
         * group[1]: 2 1
         * group[2]: 2 1 0
         *
         * 从i开始遍历(倒序看上面这个过程,填充"列"),而且排序后递增顺序能保证相同的数不在同一行(下面被新数填充)
         * i == 0时,使用一个0放入group[2][2]即可,剩余一个0可以加入缓存,这个缓存的值在后续的i都是可以使用的。
         * i == 1时,使用两个1, 分别放在group[1][1], group[2][1].
         * i == 2时,使用两个2和缓存里的0, 分别放在group[0][0], group[1][0], group[2][0]的位置。
         */
    public int maxIncreasingGroups(List<Integer> usageLimits) {
        Collections.sort(usageLimits);
        long available = 0;
        int group = 0;
        for(int limit : usageLimits){
            available += limit;
            if(available > group){
                group += 1;
                available -= group;
            }
        }
        return group;
    }
}

2791. 树中可以形成回文的路径数

难度困难18

给你一棵 (即,一个连通、无向且无环的图), 节点为 0 ,由编号从 0n - 1n 个节点组成。这棵树用一个长度为 n 、下标从 0 开始的数组 parent 表示,其中 parent[i] 为节点 i 的父节点,由于节点 0 为根节点,所以 parent[0] == -1

另给你一个长度为 n 的字符串 s ,其中 s[i] 是分配给 iparent[i] 之间的边的字符。s[0] 可以忽略。

找出满足 u < v ,且从 uv 的路径上分配的字符可以 重新排列 形成 回文 的所有节点对 (u, v) ,并返回节点对的数目。

如果一个字符串正着读和反着读都相同,那么这个字符串就是一个 回文

示例 1:

img

输入:parent = [-1,0,0,1,1,2], s = "acaabc"
输出:8
解释:符合题目要求的节点对分别是:
- (0,1)、(0,2)、(1,3)、(1,4) 和 (2,5) ,路径上只有一个字符,满足回文定义。
- (2,3),路径上字符形成的字符串是 "aca" ,满足回文定义。
- (1,5),路径上字符形成的字符串是 "cac" ,满足回文定义。
- (3,5),路径上字符形成的字符串是 "acac" ,可以重排形成回文 "acca" 。

示例 2:

输入:parent = [-1,0,0,0,0], s = "aaaaa"
输出:10
解释:任何满足 u < v 的节点对 (u,v) 都符合题目要求。

提示:

  • n == parent.length == s.length
  • 1 <= n <= 105
  • 对于所有 i >= 10 <= parent[i] <= n - 1 均成立
  • parent[0] == -1
  • parent 表示一棵有效的树
  • s 仅由小写英文字母组成

题解:https://leetcode.cn/problems/count-paths-that-can-form-a-palindrome-in-a-tree/solution/yong-wei-yun-suan-chu-li-by-endlesscheng-n9ws/

class Solution:
    """
    1. 从 u 到 v 的路径上分配的字符可以 重新排列 形成回文串
     ==> 至多一个字母出现奇数次,其余字母出现偶数次

    2. 偶数次用0表示,奇数次用 1 表示
     ==> 用长为 26 的bool数组 => 用一个int表示

    3. 用异或来处理字母出现的异或性,计算的是从根到某个点的路径上的边异或值
        从 lca 到 b 的异或 = 根到 b 的异或值 ^ 根到 lca 的异或值 
    ==> a 到 b 的路径异或性 = XOR_a ^ XOR_lca ^ XOR_b ^ XOR_lca = XOR_a ^ XOR_b
    ==> 什么时候a和b可以形成回文串? XOR_a ^ XOR_b = 0 或者 二进制表示只有一位是1,其他都是0

    用一次 DFS 求出所有的 XOR_a
    4. 问题变成,给你一个长为 n-1 的数组,有多少个“两数异或”是 0,是1 << 0,是 1<< 1 ... 1<<25
    """
    def countPalindromePaths(self, parent: List[int], s: str) -> int:
        n = len(s)
        g = [[] for _ in range(n)]
        for i in range(1, n):
            bit = 1 << (ord(s[i]) - ord('a')) # s[i]-'a'
            g[parent[i]].append((i, bit)) # 保存parent[i]指向i有条边,边对应字母的二进制信息bit
        
        ans = 0
        cnt = Counter()

        def dfs(v: int, xor: int) -> None:
            nonlocal ans
            # 计算 v点 和 其他点的异或和
            ans += cnt[xor] # xor ^ xor = 0
            for i in range(26):
                ans += cnt[xor ^ (1 << i)] # xor 是1 << 0,是 1<< 1 ... 1<<25
            cnt[xor] += 1
            for to, wt in g[v]:
                dfs(to, xor ^ wt)
        
        dfs(0, 0)
        return ans

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

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

相关文章

Cryptopedia第4期|参与Sui生态交互,赢取SUI以及额外奖励

OKX Web3 wallet Cryptopedia第4期&#xff08;Sui生态交互专场&#xff09;现已正式开启。本期活动设置Cetus、MovEX、NAVI Protocol、Scallop和Typus Finance 5个DApp交互任务&#xff0c;用户每完成其中1个DApp交互任务并验证&#xff0c;即可参与抽取活动专属NFT。同时还有…

32位Cortex-M4 MCU:LPC54607J256ET180E、LPC54605J512BD100K 180MHz嵌入式微控制器

LPC546xx 32 位微控制器(MCU) 具有丰富的外设集、极低的功耗和增强的调试功能。 LPC546xx MCU系列采用ARM Cortex-M4内核&#xff0c;可提供以太网支持&#xff0c;并设有一个TFT LCD控制器和两个CAN FD模块。LPC546xx MCU旨在提高灵活性和性能可扩展性&#xff0c;可提供高达1…

小说小程序亲测完整版

小说小程序亲测完整版超火的微信小说小程序源码-自带采集 本套源码自带采集,拿到手的时候没有安装教程不过源码在测试的时候给大家把安装教程给补上了安装教程:PHP选择5.6以上的版本上传我们的后端解压 伪静态选择thinkphp 修改数据库链接文件config/database.php 然后我们…

小型企业使用CRM如何进行线索管理?有哪些功能?

很多小型企业面临着线索渠道单一、线索质量差、缺乏有效的跟进手段等问题。为了有效获取潜在客户&#xff0c;提高销售业绩&#xff0c;建议小型企业使用Zoho CRM系统&#xff0c;为您提供专业的小型企业CRM线索管理解决方案。 1、多渠道获客 CRM可以帮助企业从多个渠道触达客…

24考研数据结构-线性表4

目录 2.4.4单链表的查找操作&#xff08;默认带头节点&#xff0c;不带头节点后续更新&#xff09;2.4.4.1 按位查找操作2.4.4.2 按值查找操作2.4.4.3 求单链表的长度&#xff08;带和不带头节点都写了&#xff09;2.4.4.4 知识回顾与重要考点 2.4.5 单链表的创建操作2.4.5.1 头…

删除Windows顽固启动项Program

卸载软件之后可能会遇到任务管理器中启动项显示有Program这种无效项目的情况 无效项目如图所示: 解决方法 打开注册表 Win R 打开注册表后定位到 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Run 可以直接复制粘贴到地址栏进行跳…

低版本打不开高版本CAD怎么办?教你转换CAD版本方法

转换CAD文件版本的好处是多方面的。首先&#xff0c;它可以确保文件格式的兼容性&#xff0c;从而使其可以在不同版本的CAD软件中打开和编辑。这是非常重要的&#xff0c;因为如果您想在不同的计算机上查看或编辑CAD文件&#xff0c;您可能需要使用不同版本的CAD软件。通过转换…

LLaMA2可商用|GPT-4变笨|【2023-0723】【第七期】

一、大咖观点&#xff1a; 傅盛&#xff1a;ChatGPT时代如何创业 - BOTAI - 博客园Google 已经被OpenAI 超越了吗&#xff1f;| AlphaGo 之父深度访谈《人民日报》&#xff1a;大模型的竞争&#xff0c;是国家科技战略的竞争WAIC 2023 | 张俊林&#xff1a;大语言模型带来的交…

Jmeter接口自动化生成测试报告html格式

jmeter自带执行结果查看的插件&#xff0c;但是需要在jmeter工具中才能查看&#xff0c;如果要向领导提交测试结果&#xff0c;不够方便直观。 笔者刚做了这方面的尝试&#xff0c;总结出来分享给大家。 这里需要用到ant来执行测试用例并生成HTML格式测试报告。 一、ant下载安…

Android11 相机拍照权限,以及解决resolveActivity返回null

一、配置拍照和读写权限 <uses-permission android:name"android.permission.CAMERA"/> <uses-feature android:name"android.hardware.camera" /><uses-permission android:name"android.permission.WRITE_EXTERNAL_STORAGE"/&…

swagger快速升级方案

背景 在使用SpringBoot 2.6以前去创建API文档工具一般会采用SpringFox提供的Swagger库&#xff0c;但是由于SpringBoot版本的不断升级和SpringFox摆烂不更新&#xff0c;导致了SpringBoot2.6之后的项目无法使用SpringFox去生成API文档&#xff0c;或者可以使用但是有很多的bug…

PyTorch深度学习实战(6)——神经网络性能优化技术

PyTorch深度学习实战&#xff08;6&#xff09;——神经网络性能优化技术 0. 前言1. 数据准备1.1 数据集分析1.2 数据集加载 2. 使用 PyTorch 训练神经网络2.1 神经网络训练流程2.2 PyTorch 神经网络训练 3. 缩放数据集4. 修改优化器5. 构建深层神经网络小结系列链接 0. 前言 …

AcWing167. 木棒(DFS+剪枝)

输入样例&#xff1a; 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0输出样例&#xff1a; 6 5 解析&#xff1a; DFS 搜索顺序&#xff1a;根据木棒的长度从小到大枚举每根木棒&#xff0c;对于每根木棒&#xff0c;枚举可以由哪些木棍拼成&#xff0c;如果所有的木棍拼成了长度相等的多…

Cisco学习笔记(CCNA)——Equipment Infrastructure Management

Equipment infrastructure management 路由器组件 路由器的组成及功能 CPU&#xff1a;执行操作系统的指令 随机访问存储器&#xff08;RAM内存&#xff09;&#xff1a;RAM中内容断电丢失 只读存储器&#xff08;ROM&#xff09;&#xff1a;开机自检软件&#xff0c;路由…

速锐得智能汽车车身域CANFD控制芯片MCU接口电路原理图

CAN总线技术不仅涉及汽车电子和轨道交通&#xff0c;还涉及医疗器械、工业控制、智能家居和机器人网络互连&#xff0c;这些行业对CAN产品的稳定性和抗干扰能力都有很高的要求。 上篇我们讲了在汽车CAN FD上&#xff0c;数据出错可能导致数据位被错误地解析为填充位&#xff0c…

MB5B在HDB上的性能调优

背景 MB5B是用于查询物料的收发以及现有库存。日常业务查询,通常会按照月份查看某片地区物料的库存以及收发状态。 调优思路 按照客户日常操作的习惯,得到日常操作的数据范围,选出数据量最为突出最有代表性的地区和物料;利用SE30分别运行不同数量级的数据,比如20个门店、…

系统程序的编译与处理

目录&#xff1a; 一&#xff0c;程序的编译与执行 二&#xff0c;预处理详解 三&#xff0c;#define的运用 四&#xff0c;条件编译 一&#xff0c;程序的编译与执行 1&#xff0c;编译环境 首先&#xff0c;要说明的是&#xff0c;计算机只能识别二进制指令&#xff0c…

文件共享服务器(五)sicis

目录 前言 一、概述 1.iscsi概念 2.iscsi介绍 3.相关名词 二、实验 1.构建iscsi服务 2.实现步骤 服务器端 客户端 3.注意事项 总结 前言 iSCSI是由IBM发明的基于以太网的存储协议&#xff0c;该协议与SUN的NFS协议都是为了解决存储资源共享问题的解决方案。两者意图…

传统商超苦战即时零售,或沦为炮灰

眼下&#xff0c;在美团闪购、京东到家、饿了么、淘宝买菜/淘鲜达、盒马&#xff0c;还有朴朴超市、叮咚买菜等一众类超市App或者平台的绝情裹挟下&#xff0c;包含沃尔玛、家乐福、永辉、大润发、联华、华润万家、步步高、中百等等这些传统商超企业巨头&#xff0c;正过得越来…

Unity噪声图生成(编辑器扩展)

最近发现项目里很多shader都需要噪声图&#xff0c;&#xff08;shadergraph中有自己的噪声图生成&#xff09;当遇到需要噪声图时去寻找很麻烦&#xff0c;所以从网上查阅资料编写了一个Unity扩展的噪声图生成。 Perlin噪声 Perlin噪声是一种渐变噪声算法&#xff0c;由Ken …