Golang | Leetcode Golang题解之第420题强密码检验器

embedded/2024/9/22 21:41:27/

题目:

题解

func strongPasswordChecker(password string) int {hasLower, hasUpper, hasDigit := 0, 0, 0for _, ch := range password {if unicode.IsLower(ch) {hasLower = 1} else if unicode.IsUpper(ch) {hasUpper = 1} else if unicode.IsDigit(ch) {hasDigit = 1}}categories := hasLower + hasUpper + hasDigitswitch n := len(password); {case n < 6:return max(6-n, 3-categories)case n <= 20:replace, cnt, cur := 0, 0, '#'for _, ch := range password {if ch == cur {cnt++} else {replace += cnt / 3cnt = 1cur = ch}}replace += cnt / 3return max(replace, 3-categories)default:// 替换次数和删除次数replace, remove := 0, n-20// k mod 3 = 1 的组数,即删除 2 个字符可以减少 1 次替换操作rm2, cnt, cur := 0, 0, '#'for _, ch := range password {if ch == cur {cnt++continue}if remove > 0 && cnt >= 3 {if cnt%3 == 0 {// 如果是 k % 3 = 0 的组,那么优先删除 1 个字符,减少 1 次替换操作remove--replace--} else if cnt%3 == 1 {// 如果是 k % 3 = 1 的组,那么存下来备用rm2++}// k % 3 = 2 的组无需显式考虑}replace += cnt / 3cnt = 1cur = ch}if remove > 0 && cnt >= 3 {if cnt%3 == 0 {remove--replace--} else if cnt%3 == 1 {rm2++}}replace += cnt / 3// 使用 k % 3 = 1 的组的数量,由剩余的替换次数、组数和剩余的删除次数共同决定use2 := min(min(replace, rm2), remove/2)replace -= use2remove -= use2 * 2// 由于每有一次替换次数就一定有 3 个连续相同的字符(k / 3 决定),因此这里可以直接计算出使用 k % 3 = 2 的组的数量use3 := min(replace, remove/3)replace -= use3remove -= use3 * 3return (n - 20) + max(replace, 3-categories)}
}func max(a, b int) int {if b > a {return b}return a
}func min(a, b int) int {if a > b {return b}return a
}

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

相关文章

【补充篇】Davinci工具要求的dbc格式

1 简介 目前国内一般E/E架构使用的建模软件多为PREEvision、EnterPrise Architect、Rhapsody等,每个工具都有各自的优势,但对AUTOSAR的适配也不全都尽如人意。比方说,EA本身的输出物是XML格式,做通信系统设计的话需要基于C#做一定的二次开发来转换格式。虽然PREEvision支持…

基于量子通讯进行安全认证

8月16日,中国银行的一项发明专利“安全认证方法、装置、电子设备及计算机存储介质”授权公告。其申请于2022年6月29日,公布于2022年9月20日。据悉,该发明中应用了量子通讯/量子随机数相关技术。 事实上,近年来,有多家银行探索研究量子技术。在多家银行的2024半年报中,就…

设备稳定流畅视频体验,乐鑫ESP32-S3芯片方案无线音视频传输通信

在快节奏的现代生活中&#xff0c;家庭安全和便利性成为了人们日益关注的话题。随着物联网技术的发展&#xff0c;智能家居安全系统正逐渐成为守护家庭的新选择。 家居安全如门锁和警报器&#xff0c;这些产品通过先进的传感器、摄像头和智能分析技术&#xff0c;不仅能够实时…

想学习下Python和深度学习,Python需要学习到什么程度呢?

想要学习Python和深度学习&#xff0c;Python的学习程度需要达到能够熟练运用这门语言进行编程&#xff0c;并能够理解和实现深度学习模型的基本构建和训练过程。以下是一些推荐的书籍&#xff0c;可以帮助你系统地学习Python和深度学习&#xff1a; Python学习推荐书籍 《Py…

线程安全的Set

Set<String> set2 new CopyOnWriteArraySet<>();Set<String> set3 Collections.synchronizedSet(new HashSet<>());

插入与冒泡排序(C++)

\一、插入排序 1 简介 插入排序&#xff0c;也称为直接插入排序&#xff0c;其排序思想和我们平时打扑克牌时排序类似。 2 算法步骤 将第一个元素看作已排序序列&#xff0c;第二个到最后一个看作未排序序列。 第二个元素&#xff0c;与之前已排序号的序列进行对比&#x…

c++primer 第八章函数编程答案

题一 #include <iostream> using namespace std;void print(char *str, int n 0);int main() {char str[20] "leonardo liu";print(str);print(str, 5);print(str, 16);return 0; }void print(char *str, int n) {static int flag 0; // 唯一初始化flag;if …

【编程基础知识】MySQL中什么叫做聚簇索引、非聚簇索引、回表、覆盖索引

在MySQL中&#xff0c;聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-Clustered Index&#xff09;是两种不同类型的索引&#xff0c;它们在数据存储和查询性能上有不同的特点&#xff1a; 聚簇索引&#xff08;Clustered Index&#xff09; 聚…