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

embedded/2024/9/25 0:06:25/

题目:

题解

class Solution {public int strongPasswordChecker(String password) {int n = password.length();int hasLower = 0, hasUpper = 0, hasDigit = 0;for (int i = 0; i < n; ++i) {char ch = password.charAt(i);if (Character.isLowerCase(ch)) {hasLower = 1;} else if (Character.isUpperCase(ch)) {hasUpper = 1;} else if (Character.isDigit(ch)) {hasDigit = 1;}}int categories = hasLower + hasUpper + hasDigit;if (n < 6) {return Math.max(6 - n, 3 - categories);} else if (n <= 20) {int replace = 0;int cnt = 0;char cur = '#';for (int i = 0; i < n; ++i) {char ch = password.charAt(i);if (ch == cur) {++cnt;} else {replace += cnt / 3;cnt = 1;cur = ch;}}replace += cnt / 3;return Math.max(replace, 3 - categories);} else {// 替换次数和删除次数int replace = 0, remove = n - 20;// k mod 3 = 1 的组数,即删除 2 个字符可以减少 1 次替换操作int rm2 = 0;int cnt = 0;char cur = '#';for (int i = 0; i < n; ++i) {char ch = password.charAt(i);if (ch == cur) {++cnt;} else {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 / 3;cnt = 1;cur = ch;}}if (remove > 0 && cnt >= 3) {if (cnt % 3 == 0) {--remove;--replace;} else if (cnt % 3 == 1) {++rm2;}}replace += cnt / 3;// 使用 k % 3 = 1 的组的数量,由剩余的替换次数、组数和剩余的删除次数共同决定int use2 = Math.min(Math.min(replace, rm2), remove / 2);replace -= use2;remove -= use2 * 2;// 由于每有一次替换次数就一定有 3 个连续相同的字符(k / 3 决定),因此这里可以直接计算出使用 k % 3 = 2 的组的数量int use3 = Math.min(replace, remove / 3);replace -= use3;remove -= use3 * 3;return (n - 20) + Math.max(replace, 3 - categories);}}
}

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

相关文章

弹性负载均衡ELB 详解和设置方法

一、弹性负载均衡ELB 详解 1. 定义与概念 弹性负载均衡&#xff08;Elastic Load Balancing&#xff0c;简称ELB&#xff09;是一种将访问流量自动分发到多台云服务器的流量分发控制服务。它通过在多个后端服务器之间均衡分配请求&#xff0c;提高应用程序的可用性、可扩展性…

C++ STL容器(三) —— 迭代器底层剖析

本篇聚焦于STL中的迭代器&#xff0c;同样基于MSVC源码。 文章目录 迭代器模式应用场景实现方式优缺点 UML类图代码解析list 迭代器const 迭代器非 const 迭代器 vector 迭代器const 迭代器非const迭代器 反向迭代器 迭代器失效参考资料 迭代器模式 首先迭代器模式是设计模式中…

Redis安全

免责声明&#xff1a;本文仅做分享~ 听说 Redis出网 就容易挨打 &#xff1f;&#xff1f;&#xff1f;... 1. 什么是 Redis&#xff1f; Redis (Remote Dictionary Server) 是一个开源的内存数据结构存储系统&#xff0c;广泛用于缓存、消息队列、会话管理、排行榜、实时分析…

std::move小结

1. 概念 在 C 中&#xff0c;std::move是一个极为实用的工具&#xff0c;它主要用于实现高效的资源转移。然而&#xff0c;需要明确的是&#xff0c;std::move并非真正地 “移动” 任何东西。实际上&#xff0c;它只是将一个对象的状态从一个地方转换到另一个地方&#xff0c…

数据结构栈——中缀表达式转后缀表达式

我们平常所用的标准四则运算表达式&#xff0c;如9(3-1)*310/2叫做中缀表达式&#xff0c;后缀表达式为9 3 1 - 3 * 10 2 / &#xff0c;而后缀表达式更容易被计算机所理解计算&#xff0c;我们需要利用栈将中缀表达式转成后缀表达式。 规则&#xff1a;从左到右遍历中缀表达式…

Jenkins基于tag的构建

文章目录 Jenkins参数化构建设置设置gitlab tag在工程中维护构建的版本按指定tag的版本启动服务 Jenkins参数化构建设置 选择参数化构建&#xff1a; 在gradle构建之前&#xff0c;增加执行shell的步骤&#xff1a; 把新增的shell框挪到gradle构建之前&#xff0c; 最后保存 …

[Linux] 通透讲解 什么是进程

标题&#xff1a;[Linux] 通透讲解 什么是进程 个人主页&#xff1a;水墨不写bug &#xff08;图片来自网络&#xff09; 目录 一.深入进程基本概念 二.管理好进程 1.管理好进程的方法 2.描述进程-PCB 3.组织进程 正文开始&#xff1a; 本文按照对进程的先描述再组织进行…

不靠学历,不拼年资,怎么才能月入2W?

之前统计局发布了《2023年城镇单位就业人员年平均工资情况》&#xff0c;2023年全国城镇非私营单位和私营单位就业人员年平均工资分别为120698元和68340元。也就是说在去年非私营单位就业人员平均月薪1W&#xff0c;而私营单位就业人员平均月薪只有5.7K左右。 图源&#xff1a;…