Leetcode - 周赛389

目录

一,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;
    }
}

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java的三大特性之一——继承

前言 http://t.csdnimg.cn/uibg3 在上一篇中我们已经讲解过封装&#xff0c;这里就主要讲解继承与多态 继承 1.为什么需要继承 Java中使用类对现实世界中实体来进行描述&#xff0c;类经过实例化之后的产物对象&#xff0c;则可以用来表示现实中的实体&#xff0c;但是现实…

centos7安装jdk详细步骤(yum安装与手动安装)

centos7安装jdk详细步骤&#xff08;yum安装与手动安装&#xff09; 一、使用yum安装1. 准备工作2. 检查系统是否自带jdk3. 安装jdk 二、手动安装jdk1. 下载上传jdk2. 安装jdk3. 配置环境变量 一、使用yum安装 1. 准备工作 如果你的机器可以联网可以使用此方法 ping www.baidu…

2、Java虚拟机之类的生命周期-连接(验证、准备、解析)

一、类的生命周期 连接阶段之验证 连接阶段的第一个环节是验证&#xff0c;验证的主要目的是检测Java字节码文件是否遵守了<Java虚拟机规范>中的约束。这个阶段一般是不需要程序员进行处理。 主要包含如下四个部分,具体详见<<Java虚拟机规范>>: 1、文件格…

mysql+keepalived实现对mysql的高可用

mysql数据库出现问题 133 解决方案: 在133mysql终端 实行如下命令 mysqlkeepalived实现对mysql的高可用 132 keepalived配置如下 133 keepalived配置如下 132重启keepalived服务 132关闭mysqld服务&#xff0c;vip不见了 133收到vip 132重启mysqld服务和keepalived服务,vip…

C语言——程序拷贝文件

问题如下&#xff1a; 写一个程序拷贝文件&#xff1a; 使用所学文件操作&#xff0c;在当前目录下放一个文件data.txt&#xff0c;写一个程序&#xff0c;将data.txt文件拷贝一份&#xff0c;生成data_copy.txt文件。 基本思路&#xff1a; 打开文件data.txt&#xff0c;读…

PTA题解 --- 剪切粘贴(C语言)

今天是PTA题库解法讲解的第五天&#xff0c;今天我们要讲解剪切粘贴&#xff0c;题目如下&#xff1a; 解题思路&#xff1a; 为了解决这个问题&#xff0c;你可以按照以下步骤进行&#xff1a; 读取输入字符串&#xff1a;首先读取原始字符串。 进行操作&#xff1a;根据输入…

【网络】数据中心网络技术概览

数据中心网络技术概览 一、数据中心网络架构 Crossbar架构&#xff1a;源自早期电话交换网络&#xff0c;由多个输入/输出端口和开关矩阵组成&#xff0c;实现设备间的任意连接&#xff0c;灵活且高效。 **Crossbar架构&#xff08;Crossbar Architecture&#xff09;是一种计…

springboot+vue考试管理系统

基于springboot和vue的考试管理系统 001 springboot vue前后端分离项目 本文设计了一个基于Springbootvue的前后端分离的在线考试管理系统&#xff0c;采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&…

000_coolprop_in_matlab在Matlab中使用CoolProp

在Matlab中使用CoolProp 简介 CoolProp是一个开源的热力学性质库&#xff0c;可以计算多种流体的热力学性质。CoolProp支持多种编程语言&#xff0c;包括Python、C、Matlab等。本文将介绍如何在Matlab中使用CoolProp。 CoolProp官网 本文所使用的Matlab版本为R2021a。 在Ma…

大数据分析-基于Python的网络爬虫及数据处理---智联招聘人才招聘特征分析与挖掘的算法实现

概要 随着科学技术的发展&#xff0c;人类进入了互联网时代&#xff0c;不仅数据量庞大&#xff0c;而且数据种类繁多&#xff0c;Python简单易学, 语法清晰&#xff0c;在数据操作方面有着一定优势&#xff0c;成为了数据采集和可视化领域的热门语言。本论文主要是使用Python来…

SG5032VAN差分晶振X1G004261001100专用于5G通讯设备

差分晶体振荡器(DXO)是目前行业中公认高技术&#xff0c;高要求的一款晶体振荡器&#xff0c;是指输出差分信号使用2种相位彼此完全相反的信号,从而消除了共模噪声,并产生一个更高性能的系统。差分晶振一般为六脚贴片晶振&#xff0c;输出类型分为好几种,LVDS&#xff0c;LV-PE…

MySQL | 视图

视图是一个虚拟表&#xff0c;其内容由查询定义。同真实的表一样&#xff0c;视图包含一系列带有名称的列和行数据。视图的数据变化会影响到基表&#xff0c;基表的数据变化也会影响到视图。 1. 基本使用 1.1. 创建视图 create view 视图名 as select语句&#xff1b; 创建测…

(2023,图像放大与超分辨率,扩散,缩放堆叠表示,多分辨率混合,多尺度联合抽样)Ten 的生成能力

Generative Powers of Ten 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 2. 相关工作 4. 方法 4.1. 缩放堆叠表示 4.2. 多分辨率混合 4.3. 多尺度一致抽样 4.4. 基于照片…

全球大型语言模型(LLMS)现状与比较

我用上个博文的工具将一篇ppt转换成了图片&#xff0c;现分享给各位看官。 第一部分&#xff1a;国外大语言模型介绍 1&#xff0c;openai的Chatgpt 免费使用方法1&#xff1a;choose-carhttps://share.freegpts.org/list 免费使用方法2&#xff1a;Shared Chathttps://share…

查看文件内容的指令:cat,tac,nl,more,less,head,tail.file

目录 cat 介绍 输入重定向 选项 -b -n -s tac 介绍 输入重定向 nl 介绍 示例 more 介绍 选项 less 介绍 搜索文本 选项 head 介绍 示例 选项 -n tail 介绍 示例 选项 file cat 介绍 将标准输入(键盘输入)的内容打印到标准输出: 输入重定向 本应…

Docker 存储

目录 1、概念介绍 Storage Driver 无状态容器 有状态容器 Data Volume 2、bind mount 指定挂载文件只读权限 bind mount 挂载目录 3、docker manage volume 查看 volume 自定义 volume 使用 NFS 存储 4、共享数据 容器与host共享数据 volume container data-pa…

200基于matlab的利用神经网络算法训练图片

基于matlab的利用神经网络算法训练图片&#xff0c;并利用GUI界面读取图片&#xff0c;最后将识别出的图片数值返回到GUI界面上。0-10数字数据库已有&#xff0c;可自行添加其他数据库进行训练和识别。程序已调通&#xff0c;可直接运行。 200 matlab BP神经网络 手写数字识别 …

liunx centos7 下通过yum删除安装已经安装的php

执行下面命令查看php相关的包 rpm -qa | grep php 只需要卸载几个名为common的包即可&#xff0c;其他同版本依赖会被全部删除&#xff0c;删除php71w-common&#xff0c;71w版本的依赖包全部会被删除。 查看php包的命令 rpm -qa | grep php 或 yum list installed | gre…

单引号 vs 双引号:在MyBatis条件判断中的选择困境

哈喽&#xff0c;大家好呀&#xff0c;好久不见&#xff01;今天是一篇浅记。MyBatis的条件判断中&#xff0c;使用单引号或双引号来判定字符串类型数值的坑… 一、单引号与双引号的区别 在MyBatis的条件判断中&#xff0c;使用单引号或双引号来括起字符串值都是可以的。但是在…

Linux systemd详解

1、概念 1.1 systemd systemd 是一个用于管理 Linux 系统启动过程和系统服务的系统和服务管理器。它被设计为取代传统的 System V init 系统&#xff0c;提供了更快的启动时间、并行启动服务、更好的日志记录和更强大的管理功能。 1.2 unit Unit 是 systemd 中所有配置文件…