Leetcode 第396场周赛 问题和解法

2024-05-07 03:12

本文主要是介绍Leetcode 第396场周赛 问题和解法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

问题

有效单词

有效单词需要满足以下几个条件:

至少包含3个字符。
由数字0-9和英文大小写字母组成。(不必包含所有这类字符。)
至少包含一个元音字母。
至少包含一个辅音字母。
给你一个字符串word。如果word是一个有效单词,则返回true,否则返回false。

注意:

‘a’、‘e’、‘i’、‘o’、'u’及其大写形式都属于元音字母。
英文中的辅音字母是指那些除元音字母之外的字母。

示例 1:

输入:word = “234Adas”

输出:true

解释:

这个单词满足所有条件。

解题思路

用两个变量 f0和 f1记录字符串中是否有辅音或元音,必须都为 true才返回 true

如果字符串长度不足 333 或者包含除了数字或字母以外的字符,返回 false。

class Solution {public boolean isValid(String word) {if (word.length() < 3) {return false;}boolean[] f = new boolean[2];Arrays.fill(f, false);for (char c : word.toCharArray()) {if (Character.isAlphabetic(c)) {c = Character.toLowerCase(c);f[c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' ? 1 : 0] = true;} else if (!Character.isDigit(c)) {return false;}}return f[0] && f[1];}
}

K 周期字符串需要的最少操作次数

给你一个长度为n的字符串word和一个整数k,其中k是n的因数。

在一次操作中,你可以选择任意两个下标i和j,其中0<=i,j<n,且这两个下标都可以被k整除,然后用从j开始的长度为k的子串替换从i开始的长度为k的子串。也就是说,将子串word[i…i+k-1]替换为子串word[j…j+k-1]。

返回使word成为K周期字符串所需的最少操作次数。

如果存在某个长度为k的字符串s,使得word可以表示为任意次数连接s,则称字符串word是K周期字符串。例如,如果word==“ababab”,那么word就是s="ab"时的2周期字符串。

示例1:

输入:word=“leetcodeleet”,k=4

输出:1

解释:可以选择i=4和j=0获得一个4周期字符串。这次操作后,word变为"leetleetleet"。

解题思路

1、分段统计。使用哈希表记录各段出现次数,并记录相同段的最大次数。
2、使用贪心策略。求最少操作次数,以相同段最多的作为替换基准

class Solution {public int minimumOperationsToMakeKPeriodic(String word, int k) {int len = word.length();// 1、分段统计。使用哈希表记录各段出现次数,并记录相同段的最大次数HashMap<String, Integer> segmentCntMap = new HashMap<>();int maxSegmentCnt = 0;for (int i = 0; i < len; ) {StringBuilder sb = new StringBuilder();for (int j = 0; j < k; i++, j++) {sb.append(word.charAt(i));}String segment = sb.toString();int cnt = segmentCntMap.getOrDefault(segment, 0) + 1;segmentCntMap.put(segment, cnt);maxSegmentCnt = Math.max(cnt, maxSegmentCnt);}// 2、贪心策略。求最少操作次数,以相同段最多的作为替换基准int totalSegment = len / k;return totalSegment - maxSegmentCnt;}
}

同位字符串连接的最小长度

给你一个字符串s,它由某个字符串t和若干t的同位字符串连接而成。

请你返回字符串t的最小可能长度。

同位字符串指的是重新排列一个单词得到的另外一个字符串,原来字符串中的每个字符在新字符串中都恰好只使用一次。

示例1:

输入:s=“abba”

输出:2

解释:

一个可能的字符串t为"ba"。

解题思路

1.len的因子作为 一段段字符串的截取长度。
2.都是小写字母,长度为26的数组判断是否相同就行。

class Solution {public static int minAnagramLength(String s) {char[] ch = s.toCharArray();int len = s.length();for (int i = 1; i <= len; i++) {if (len % i != 0) continue;if (minCheck(ch, i)) return i;}return len;}//不是滑窗 是一个个相同长度的字符串 截取。public static boolean minCheck(char[] ch, int m) {int len = ch.length;if (len % m != 0) return false;//比较的母体。int[] arr = new int[26];for (int i = 0; i < m; i++) {arr[ch[i] - 'a']++;}int[] nowArr = new int[26];//要跟母体比较的字符串从下标m开始。为了不错过最后一段,i能取到lenfor (int i = m; i <= len; i++) {if (i != m && i % m == 0) {//当下标不是m 且 是m的倍数时。// 那就是一段长度为m的字符串了,就可以跟母体比较了if (!Arrays.equals(nowArr, arr)) return false;nowArr = new int[26]; //比较完 清空长度为26的数组}if (i == len) break; //到底了 就要跳出了,不然要越界。nowArr[ch[i] - 'a']++; //计数}return true;}
}

使数组中所有元素相等的最小开销

给你一个整数数组nums和两个整数cost1和cost2。你可以执行以下任一操作任意次:

从nums中选择下标i并且将nums[i]增加1,开销为cost1。
选择nums中两个不同下标i和j,并且将nums[i]和nums[j]都增加1,开销为cost2。
你的目标是使数组中所有元素都相等,请你返回需要的最小开销之和。

由于答案可能会很大,请你将它对109+7取余后返回。

示例1:

输入:nums=[4,1],cost1=5,cost2=2

输出:15

解释:

执行以下操作可以使数组中所有元素相等:

将nums[1]增加1,开销为5,nums变为[4,2]。
将nums[1]增加1,开销为5,nums变为[4,3]。
将nums[1]增加1,开销为5,nums变为[4,4]。
总开销为15。

解题思路

贪心解题

class Solution {int r = 1000000007;public int minCostToEqualizeArray(int[] nums, int cost1, int cost2) {int n = nums.length;long ans = 0;long sum = 0,res=0;// System.out.println(maxn);Arrays.sort(nums);int maxn = nums[n - 1];for(int i=0;i<n;i++){nums[i]=maxn-nums[i];}Arrays.sort(nums);maxn=nums[n-1];System.out.println(sum+"a"+maxn);if (n == 2) {long a=nums[1],b=nums[0];return (int)(( a-b ) * cost1%r);}for (int num : nums)sum +=  num;if (cost1 * 2 <= cost2) {return (int) (sum*cost1%r);}if(maxn*2>sum){//res=sum-2*(sum-maxn);ans=(ans+(sum-maxn)*cost2)%r;res=2*maxn-sum;}else{ans=(ans+sum/2*cost2)%r;if(sum%2==1)res=1;}System.out.println(ans+" "+res);//如果存在多个n-2-2k正好构成resif(n%2==0&&res%2==1){ans=(ans+cost1)%r;res--;if(res==0)return (int) ans % r;}// long a1=cost1*res;// long a2=cost2*// ans+=Math.min();for(int k=0;k*2+2<n&&res>0;k++){long x=n-2-2*k;long u=res/x;ans=(ans+Math.min(u*(x+1+k)*cost2,x*u*cost1))%r;res=res-x*u;}return (int) ans % r;}
}

来源

LeetCode周赛

这篇关于Leetcode 第396场周赛 问题和解法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966156

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2