Leetcode - 周赛389

news2024/9/25 11:10:05

目录

一,3083. 字符串及其反转中是否存在同一子字符串

二,3084. 统计以给定字符开头和结尾的子字符串总数

三,3085. 成为 K 特殊字符串需要删除的最少字符数

四,3086. 拾起 K 个 1 需要的最少行动次数


一,3083. 字符串及其反转中是否存在同一子字符串

本题是一道字符串题,问原字符串s中是否存在两个连续的字符,使得这两个字符还存在于s的逆序字符串中,有返回true,没有返回false,直接上代码:

class Solution {
    public boolean isSubstringPresent(String s) {
        char[] ch = s.toCharArray();
        boolean[][] bool = new boolean[26][26];
        for(int i=1; i<ch.length; i++){
            int x = ch[i-1]-'a';
            int y = ch[i]-'a';
            bool[x][y] = true;
            if(bool[y][x])
                return true;
        } 
        return false;
    }
}

二,3084. 统计以给定字符开头和结尾的子字符串总数

本题看上去是一道字符串题,实际是一道排列组合题,先算出字符转 s 中出现字符 c 的个数,记作 n ,从这 n 个字符中选取1个或两个,问有多少种情况,代码如下:

class Solution {
    public long countSubstrings(String s, char c) {
        long ans = 0;
        long cnt = 0;
        for(char ch : s.toCharArray()){
            if(ch == c)
                cnt++;
        }
        return (cnt+1)*cnt/2;
    }
}

三,3085. 成为 K 特殊字符串需要删除的最少字符数

 

本题题意:在只能执行删除操作的情况下,问最少删除几个字符,才能满足任意两个字符在字符串word中出现的次数之差要小于等于k。

思路:先统计每一个字符在字符串中的出现次数,再枚举要保留的字符的出现次数,求出要删除字符串的个数,最后在其中找出最小值并返回。

代码如下:

class Solution {
    public int minimumDeletions(String word, int k) {
        int[] cnt = new int[26];
        for(char ch : word.toCharArray()){
            cnt[ch-'a']++;
        }
        int ans = Integer.MAX_VALUE;
        int sum = 0;
        Arrays.sort(cnt);
        for(int i=0; i<26; i++){
            if(i>0)
                sum += cnt[i-1];
            int t = 0;
            int mx = cnt[i]+k;
            for(int j=i+1; j<26; j++){
                if(mx < cnt[j])
                    t += cnt[j]-mx;
            }
            ans = Math.min(ans, sum+t);
        }
        return ans;
    }
}

四,3086. 拾起 K 个 1 需要的最少行动次数

本题题意,选择任意一个下标 idx 作为起始点(固定不动),如果nums[idx]==1,就可以不需要操作直接拿到1,nums[idx]重新变成0,可以执行以下操作:

  • 选择任意一个nums[i]==0 && i != idx,将nums[i]变成1,该操作最多执行 maxChange次
  • 选择相邻的两个下标 x,y,且两个值相加必须为1(即一个值为0,另一个值为1),将这两个下标的值交换,如果交换后,nums[idx] == 1,可以拿走1,nums[idx]重新变成0

返回拾起 k 个 1 所需的最少行动次数

可以得到以下拾起1的操作:

  • nums[idx]==1,需要 0 次操作
  • 与nums[idx]相邻的值为1,需要执行1次操作
  • 使用操作一,需要执行2次操作才能拿到1 (1次操作一+1次操作二)
  • 只用操作二,需要执行 |i - idx| 次操作才能拿到1

根据上述操作,可以得出一些操作优先级:

  1. idx,idx+1,idx-1 这些下标的值为1
  2. 执行操作一来获得1
  3. 执行操作二来获得1

先把maxChange比较大的情况处理了,设 c 为连续1的出现次数,如果maxChange >= k - c,说明剩下的 k-c 个 1 可以使用操作一得到,直接返回 2*(k-c)+Math.max(c-1,0)。

如果maxChange比较小,优先执行操作一,也就是说还需要 size = k - maxChange 个 1,因这size个1只能通过操作二获得,所以接下的问题就变成了货舱选址问题,即如何选择一个地点,使得所有的货舱到达该地点的距离之和最小,这里直接告诉你们结论,选择中位数的地方。

注:可能会疑惑为什么这里没有优先考虑连续1的操作?因为选取连续1的操作本质上也是操作二,也就是说,这里的货舱选址问题已经包含了这种情况。

 代码如下:

class Solution {
    //当出现连续的三个1时,收取3个1的最少操作是2次,操作二两次
    //当出现连续的两个1时,收取2个1的最少操作是1次,操作二一次
    public long minimumMoves(int[] nums, int k, int maxChanges) {
        List<Integer> list = new ArrayList<>();//统计1的下标
        int c = 0;//统计连续出现的1的最大次数(0,1,2,3),再大就不赚了
        for(int i=0; i<nums.length; i++){
            if(nums[i] == 1){
                list.add(i);
                c = Math.max(c, 1);
                if(i>0 && nums[i-1]==nums[i]){
                    c = Math.max(c, 2);
                    if(i>1 && nums[i-2]==nums[i-1])
                        c = Math.max(c, 3);
                }
            }
        }
        c = Math.min(c,k);
        if(c + maxChanges >= k)
            return 2*(k-c)+Math.max(c-1,0);
        int n = list.size();
        long[] pre = new long[n+1];
        long ans = Long.MAX_VALUE;
        for(int i=0; i<n; i++)
            pre[i+1] = pre[i] + list.get(i);
        int size = k - maxChanges;
        for(int l=0,r=size-1; r<n; l++,r++){
            int i = (l+r)/2;
            long s1 = (i-l)*list.get(i)-(pre[i]-pre[l]);
            long s2 = (pre[r+1]-pre[i])-(r+1-i)*list.get(i);
            ans = Math.min(ans, s1+s2);
        }
        return ans + 2*maxChanges;
    }
}

 

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

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

相关文章

HTML5和CSS3笔记

一&#xff1a;网页结构(html)&#xff1a; 1.1&#xff1a;页面结构&#xff1a; 1.2&#xff1a;标签类型&#xff1a; 1.2.1&#xff1a;块标签&#xff1a; 1.2.2&#xff1a;行内标签&#xff1a; 1.2.3&#xff1a;行内块标签&#xff1a; 1.2.4&#xff1a;块标签与行…

钡铼R40工业4G路由器保障智能物流仓储系统高效运行

随着物流行业的不断发展和智能化技术的广泛应用&#xff0c;智能物流仓储系统已成为提升物流效率、降低成本、提高服务质量的重要手段。在这样的背景下&#xff0c;钡铼R40工业4G路由器作为一种先进的网络通信设备&#xff0c;在智能物流仓储系统中扮演着关键的角色&#xff0c…

【小米汽车SU7实测】 小米汽车su7到底行不行?小米新能源轿车体验感怎么样?

小米汽车SU7是小米汽车的首款车型&#xff0c;定位“C级高性能生态科技轿车”&#xff0c;也是小米迈入新能源赛道的首次成果落地。 首先&#xff0c;让我们来谈谈它的性能。试驾过程中&#xff0c;小米SU7展现出了惊人的加速能力&#xff0c;0-100km/h加速仅需2.78秒&#xf…

【设计】 【数学】1622 奇妙序列

本文涉及知识点 设计 数学 LeetCode1622. 奇妙序列 请你实现三个 API append&#xff0c;addAll 和 multAll 来实现奇妙序列。 请实现 Fancy 类 &#xff1a; Fancy() 初始化一个空序列对象。 void append(val) 将整数 val 添加在序列末尾。 void addAll(inc) 将所有序列中的…

2024 年 5 个 Linux 开源数字化学习平台

与其他行业一样&#xff0c;教育界多年来一直在经历数字化转型的过程。随着数字化学习平台的建立&#xff0c;目前只要能上网&#xff0c;任何人都可以接受教育。 “e-learning”一词的意思是“数字化学习”&#xff0c;是当今最常用的词之一。 它指的是通常在互联网上进行的培…

[c++] c++ 中的一些关键字:explicit, delete, default, override, final, noexcept

1 explicit explicit 的意思是清楚的&#xff0c;明显的。一般用在类的构造函数中&#xff0c;防止隐式转换。 explicit specifier - cppreference.com 如下代码&#xff0c; (1) 类 A 的两个构造函数都没有使用 explicit 修饰&#xff0c;所以如下两行代码&#xff0c;隐式…

ubuntu 如何使用阿里云盘

你好&#xff0c;我是 shengjk1&#xff0c;多年大厂经验&#xff0c;努力构建 通俗易懂的、好玩的编程语言教程。 欢迎关注&#xff01;你会有如下收益&#xff1a; 了解大厂经验拥有和大厂相匹配的技术等 希望看什么&#xff0c;评论或者私信告诉我&#xff01; 文章目录 一…

网络学习:IPV6基础配置

目录 一、配置接口的全球单播地址 二、配置接口本地链路地址 三、配置接口任播地址 四、配置接口PMTU 配置静态PMTU&#xff1a; 配置动态PMTU&#xff1a; 五、接口配置IPV6地址示例&#xff1a; 一、配置接口的全球单播地址 全球单播地址类似于IPv4公网地址&#xff0…

postman下载汉化以及使用

【2023全网最牛教程】10分钟快速上手Postman&#xff08;建议收藏&#xff09;_macbook postman打开慢-CSDN博客 Postman 汉化教程&#xff08;小白&#xff09;配置的具体操作_postman怎么设置中文-CSDN博客 上面是两篇参考的博客 postman是一款支持http协议的接口调试与测试…

100道面试必会算法-10-K 个一组翻转链表

100道面试必会算法-10-K 个一组翻转链表 题目描述 给你链表的头节点 head &#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回修改后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点…

活动图高阶讲解-09

1 00:00:00,000 --> 00:00:04,000 上次的练习不知道大家做了没有 2 00:00:04,000 --> 00:00:07,000 没有做的话赶紧做 3 00:00:07,000 --> 00:00:09,000 把它发过来 4 00:00:09,000 --> 00:00:11,000 接下来&#xff0c;下一个 5 00:00:11,000 --> 00:00:16…

ARM实验 LED流水灯

.text .global _start _start: 使能GPIOE GPIOF的外设时钟 RCC_MP_AHB4ENSETR的第[4][5]设置为1即可使能GPIOE GPIOF时钟 LDR R0,0X50000A28 指定寄存器地址 LDR R1,[R0] 将寄存器原来的数值读取出来&#xff0c;保存到R1中 ORR R1,R1,#(0x3<<4) 将第4位设置为1 S…

开源项目ChatGPT-Next-Web的容器化部署(一)-- 优化Dockerfile

一、背景 最近比较火的无疑是chatgpt了&#xff0c;找到一款开源github项目&#xff0c;在其基础上修改&#xff0c;定制出适合于自身业务的系统。 它是nodejs后端项目&#xff0c;github地址是&#xff1a;https://github.com/ChatGPTNextWeb/ChatGPT-Next-Web&#xff0c;依…

面试算法-87-分隔链表

题目 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 示例 1&#xff1a; 输入&#xff1a;head [1,4,3,2,5,2], x …

(力扣)删除链表的倒数第N个节点 C++

1、题目描述 2、三种方法 &#xff08;1&#xff09;方法一&#xff1a;计算链表长度 创建一个虚拟节点来处理删除头节点的情况通过计算链表的长度确定要删除节点的位置。使用双指针中的一个指针&#xff0c;移动到要删除节点的前一个位置。将指针后面的节点跳过&#xff0c;…

深度学习 线性神经网络(线性回归 从零开始实现)

介绍&#xff1a; 在线性神经网络中&#xff0c;线性回归是一种常见的任务&#xff0c;用于预测一个连续的数值输出。其目标是根据输入特征来拟合一个线性函数&#xff0c;使得预测值与真实值之间的误差最小化。 线性回归的数学表达式为&#xff1a; y w1x1 w2x2 ... wnxn …

openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint

文章目录 openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint249.1 功能描述249.2 语法格式249.3 参数说明249.4 示例 openGauss学习笔记-249 openGauss性能调优-使用Plan Hint进行调优-Join顺序的Hint 249.1 功能描述 指明join的顺序&#xff0…

内存卡的照片怎么突然就找不到了,内存卡照片突然找不到如何恢复

最近,我遇到了一个令人困惑的问题,就是我的内存卡中的照片突然间找不到了。作为一个热爱摄影的人,我经常使用内存卡来存储我的珍贵照片。然而,最近我发现,无论我如何搜索和浏览,这些照片似乎就像消失了一样。内存卡照片突然找不到如何恢复?虽然挺沮丧的,但幸好遇上了以…

五分钟快速搭建个人游戏网站(1Panel)

五分钟快速搭建个人游戏网站&#xff08;1Panel&#xff09; 环境要求&#xff1a;主流 Linux 发行版本&#xff08;基于 Debian / RedHat&#xff0c;包括国产操作系统&#xff09;&#xff1b; 如果是Windows OS的可以通过WSL来实现安装。 1 介绍 1Panel 是一个基于 Web 的 L…

OpenCV+OpenCV-Contrib源码编译

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、OpenCV是什么&#xff1f;二、OpenCV 源码编译1.前期准备1.1 源码下载1.2 cmake安装1.3 vscode 安装1.4 git 安装1.5 mingw安装 2.源码编译2.1 打开cmake2.…