Leetcode - 周赛396

embedded/2024/10/19 3:26:42/

目录

一,3136. 有效单词

二,3137. K 周期字符串需要的最少操作次数

三,3138. 同位字符串连接的最小长度

四,3139. 使数组中所有元素相等的最小开销


一,3136. 有效单词

本题就是一道阅读理解题:

  • 字符串长度小于3,返回false
  • 字符串出现除了26个字母和数字以外的字符,返回false
  • 字符串中必须出现至少一个元音字母,一个辅音字母

代码如下: 

class Solution {public boolean isValid(String word) {if(word.length() < 3) return false;String t = "aeiouAEIOU";int a = 0, b = 0, c = 0;for(char ch : word.toCharArray()){if(ch>='a'&&ch<='z'||ch>='A'&&ch<='Z'){if(t.indexOf(ch)!=-1){a++;}else{b++;}}else if(ch>='0'&&ch<='9'){c++;}else{return false;}}return a>0&&b>0;}
}

二,3137. K 周期字符串需要的最少操作次数

本题求最少操作次数,正难则反,可以转换成最多保留多少个长度为k的字符串,可以使用HashMap来存储长度为k的子字符串出现次数,用 总数 - 最多的出现次数 就是答案。

代码如下:

class Solution {public int minimumOperationsToMakeKPeriodic(String word, int k) {Map<String,Integer> map = new HashMap<>();int mx = 0;for(int i=0; i<=word.length()-k; i+=k){String t = word.substring(i, i+k);map.merge(t, 1, Integer::sum);mx = Math.max(mx, map.get(t));}return word.length()/k - mx;}
}

三,3138. 同位字符串连接的最小长度

本题的题意:能否将字符串均匀分成 x 段,使得每一段字符串出现字符的种类和数目一样,返回最短的子字符串,可以直接暴力

代码如下:

class Solution {public int minAnagramLength(String s) {char[] ch = s.toCharArray();int n = s.length();for(int k=1; k<=n/2; k++){if(n%k != 0) continue;int[] cnt = new int[26];for(int j=0; j<k; j++){cnt[ch[j]-'a']++;}boolean flg = true;//判断后续分成的字段是否符合条件for(int i=k; i<=n-k; i+=k){int[] cnt0 = new int[26];for(int j=i; j<i+k; j++){cnt0[ch[j]-'a']++;}if(!Arrays.equals(cnt, cnt0)){flg = false;break;}}if(!flg) continue;return k;}return n;}
}

四,3139. 使数组中所有元素相等的最小开销

在写题之前,需要先解决一个问题,当数组中所有的元素相等时,这个相等的值(k)是否一定要等于原数组中的最大值?这是不一定的,比如 [1,14,14,15],cost1=2,cost2=1,该样例的中,当它的所有元素等于21时,它的所有开销最小,所以需要从max(nums)开始枚举这个k,不断的求出其中的最小值。

分类讨论:

  • cost1 * 2 <= cost2 ,直接全部使用 cost1 来增加,返回 s * cost1 % MOD
  • 接下来就是如何判断何时使用 cost1,cost2。易知,只有先使用cost2,再使用cost1,才能使得答案越小,这里讲一个结论,令 d = k - mn,s = 整个数组需要增加的1的次数:当 d <= s - d 时,res = s / 2 * cost2 + s % 2 * cost1;当 d > s - d 时,res = (s - d) * cost2 + (2*d - s) * cost1;

结论说明:上述选择同增(cost2)还是单增(cost1)的问题,可以转化成——给你一个字符串(只包含小写字母),让他重新排列,问你能否使得这个字符串相邻的字符不相同?

实在不明白可以去写一下这个题  重排字符串 (nowcoder.com)

class Solution {public int minCostToEqualizeArray(int[] nums, int cost1, int cost2) {int MOD = (int)1e9 + 7;long mx = 0, mn = nums[0], sum = 0;int n = nums.length;for(int x : nums){mx = Math.max(mx, x);mn = Math.min(mn, x);sum += x;}long s = n*mx - sum;if(2*cost1 <= cost2) return (int)(s * cost1 % MOD);long ans = Long.MAX_VALUE;for(long i=mx; i<mx*2+1; i++){long d = i - mn;long res = 0;if(d <= s - d){res = s/2*cost2+s%2*cost1;}else{res = (s - d)*cost2+(d*2-s)*cost1;}s += n;ans = Math.min(ans, res);}return (int)(ans%MOD);}
}

优化:二分

class Solution {long base,n;long mn, mx, c1, c2;public int minCostToEqualizeArray(int[] nums, int cost1, int cost2) {int MOD = (int)1e9 + 7;this.c1 = cost1;this.c2 = cost2;long mx = 0, mn = nums[0];long sum = 0;int n = nums.length;this.n = n;for(int x : nums){mx = Math.max(mx, x);mn = Math.min(mn, x);sum += x;}long base = n*mx - sum;this.base = base;this.mx = mx;this.mn = mn;if(2*cost1 <= cost2) return (int)(base * cost1 % MOD);long ans = Long.MAX_VALUE;if(mx%2==1){    ans = f(mx);mx += 1;base += n;}long l = mx/2, r = mx;//偶数while(l <= r){long k = (l + r)/2;if(f(k*2)<f((k+1)*2)){r = k - 1;}else{l = k + 1;}}long k0 = r + 1;l = mx/2;r = mx;while(l <= r){//奇数long k = (l + r)/2;if(f(k*2+1) < f((k+1)*2+1)){r = k - 1;}else{l = k + 1;}}long k1 = r + 1;ans = Math.min(ans, f(k0*2));ans = Math.min(ans, f(k1*2+1));return (int)(ans%MOD);}private long f(long i){long s = base + (i - mx)*n;long d = i - mn;if(d <= s - d){return s/2*c2 + s%2*c1;}return (s-d)*c2+(d*2-s)*c1;}
}

 


http://www.ppmy.cn/embedded/41269.html

相关文章

运维别卷系列 - 云原生监控平台 之 01.prometheus 入门和部署

文章目录 [toc]什么是 PrometheusPrometheus 架构及其一些生态系统组件Prometheus 的工作模式Prometheus 的适用场景Prometheus 的不适用场景Prometheus 词汇表 Prometheus 启动参数Prometheus 配置文件通用占位符定义配置文件示例解释服务发现 Prometheus 部署创建 namespace创…

数据库的存储过程、函数与触发器

使用下面的场景来引入 1.创建表 CREATE DATABASE staff; USE staff; CREATE TABLE employee(id INT NOT NULL AUTO_INCREMENT,userName VARCHAR(255),birthDate DATE,idCard VARCHAR(255),loginName VARCHAR(255),PASSWORD VARCHAR(255),mobile VARCHAR(255),email VARCHAR(2…

【简单介绍下Debian常用命令】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

keepalived双机热备超详细入门介绍

keepalived 一、keepalived入门介绍 1.keepalived简介 2.keepalived服务的三个重要功能 2.1.管理LVS负载均衡软件 2.2.实现对LVS集群节点健康检查功能 2.3.作为系统网络服务的高可用功能 3.keepalived高可用故障切换转移原理 4.keepalived安装及主配置文件介绍 …

ORACLE 生成AWR常用脚本

ORACLE 生成AWR常用脚本 常用脚本功能介绍1、脚本介绍 awrrpt.sql -- 生成指定快照区间的统计报告 awrrpti.sql -- 生成指定数据库实例&#xff0c;并指定快照区间的统计报告 awrsqlrpt.sql -- 生成指定快照区间&#xff0c;指定SQL语句的统计报告 awrsqrpi.sql -- 生成指定数…

保研面试408复习 4——操作系统、计网

文章目录 1、操作系统一、文件系统中文件是如何组织的&#xff1f;二、文件的整体概述三、UNIX外存空闲空间管理 2、计算机网络一、CSMA/CD 协议&#xff08;数据链路层协议&#xff09;二、以太网MAC帧MTU 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、…

Java面试题:线程池的核心参数和工作原理

线程池的核心参数 ThreadPoolExecutor(int corePoolSize,//核心线程数目int MaximumPoolSize,//最大线程数核心线程临时线程long keepAliveTime,//临时线程的存活时间,在存活时间内如果没有新任务,线程资源会被释放TimeUnit unit,//存活时间的时间单位,一个枚举类型BlockingQu…

stm32H7 QSPI W25Q256换成W25Q128JV

正点原子阿波罗stm32H743修改 1. QSPI_Handler.Init.FlashSizePOSITION_VAL(0X1000000)-1; 2.QSPI_Send_CMD(W25X_FastReadData,ReadAddr,8,QSPI_INSTRUCTION_4_LINES,QSPI_ADDRESS_4_LINES,QSPI_ADDRESS_32_BITS,QSPI_DATA_4_LINES); QSPI_Send_CMD(W25X_PageProgram,Wr…