LintCode领扣 题解丨阿里高频面试题:密码强度检查器

简介: LintCode领扣 题解丨阿里高频面试题:密码强度检查器

当以下条件都满足时,一个密码被视为是强密码:

至少包含6个字符,但不超过20个字符。
至少包含一个小写字母,一个大写字母,和一个数字。
不能包含三个连续的重复字符("...aaa..."是弱密码,但"...aa...a..."是强密码,假设它们的其他条件都满足了)。
写一个函数strongPasswordChecker(s),它将一个字符串s作为输入,并且返回将其转换成强密码需要的最少改变次数。如果s已经是一个强密码了,返回0。

插入、删除或者替换任意一个字符都视为一次改变。

在线评测地址:https://www.lintcode.com/problem/strong-password-checker/?utm_source=sc-tc-sz0811

样例 1:

输入:"aaa123"
输出:1
解释:"aaa123"->"aaA123"
样例 2:

输入:"a"
输出:5
解释:"a"->"aa"->"aaA"->"aaA1"->"aaA12"->"aaA123"
【题解】

考点:

思维
题解:本题根据要求最小的改变次数,确定修改策略即可。

变为强密码需要解决三种问题:

长度小于6时需要插入字符,长度大于20时需要删除字符
缺失字符或数字,此时可以通过插入或者替换字符解决
出现三个及以上重复字符,利用置换解决该问题会更好,可以同时做到解决情况二和情况三。
接下来,按照长度进行讨论。

当长度小于6时,尽量采用插入操作,既可以增加长度也可以避免重复字符连续。
当长度大于等于6时,对于重复字符个数k大于等于3的情况,先将其删除到最近的(3m+2)个,那么如果k正好被3整除,那么我们直接变为k-1,如果k%3=1,那么变为k-2。这样做的好处是3m+2个重复字符可以用替换m个字符来去除重复,然后遍历一次,进行删除和替换,可以直接删除3m个,最少删除操作。
public class Solution {

/**
 * @param s: a string
 * @return: return an integer
 */
public int strongPasswordChecker(String s) {
    // write  your code here
    int res = 0, n = s.length(), lower = 1, upper = 1, digit = 1;
    int [] v = new int [n];
     for (int i = 0; i < n;) {        //遍历是否存在缺失字符种类
        if (s.charAt(i) >= 'a' && s.charAt(i) <= 'z') {
            lower = 0;
        }
        if (s.charAt(i) >= 'A' && s.charAt(i) <= 'Z') {
            upper = 0;
        }
        if (s.charAt(i) >= '0' && s.charAt(i) <= '9') {
            digit = 0;
        }
        int j = i;
        while (i < n && s.charAt(i) == s.charAt(j)) {
            ++i;
        }
        v[j] = i - j;    //标记j位置开始连续重复字符的数量
    }
    int missing = (lower + upper + digit);     //缺失的字符种类数
    if (n < 6) {
        int diff = 6 - n;                    //缺失的长度
        res += diff + Math.max(0, missing - diff);    //缺失长度加上missing - diff差值(因为增加的字符不一定补全字符种类,替换)
    } 
    else {
        int over = Math.max(n - 20, 0), left = 0;    //超出长度
        res += over;
        for (int k = 1; k < 3; ++k) {         //如果重复数量k%3==0,-1达到3m+2。如果k%3==1,-2达到3m+2
            for (int i = 0; i < n && over > 0; ++i) {
                if (v[i] < 3 || v[i] % 3 != (k - 1)) {
                    continue;
                }
                v[i] -= k;
                over -=k;            //删除字符
            }
        }
        for (int i = 0; i < n; ++i) {
            if (v[i] >= 3 && over > 0) {
                int need = v[i] - 2;        //通过-2得到3m
                v[i] -= over;
                over -= need;            //直接选择删除3m个
            }
            if (v[i] >= 3)  {        //如果v[i]>=3那么需要进行替换操作
                left += v[i] / 3;
            }
        }
        res += Math.max(missing, left);    //每次除以3即为替换的字符个数
    }
    return res;
    
}

}
更多题解参见九章算法官网:
https://www.jiuzhang.com/solution/strong-password-checker/?utm_source=sc-tc-sz0811

相关文章
|
6月前
|
Python 开发工具
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
2024年Python最全使用Python实现音频双通道分离,2024年最新阿里p7面试难度
|
25天前
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
5天前
|
SQL 关系型数据库 MySQL
阿里面试:1000万级大表, 如何 加索引?
45岁老架构师尼恩在其读者交流群中分享了如何在生产环境中给大表加索引的方法。文章详细介绍了两种索引构建方式:在线模式(Online DDL)和离线模式(Offline DDL),并深入探讨了 MySQL 5.6.7 之前的“影子策略”和 pt-online-schema-change 方案,以及 MySQL 5.6.7 之后的内部 Online DDL 特性。通过这些方法,可以有效地减少 DDL 操作对业务的影响,确保数据的一致性和完整性。尼恩还提供了大量面试题和解决方案,帮助读者在面试中充分展示技术实力。
|
1月前
|
消息中间件 存储 canal
阿里面试:canal+MQ,会有乱序的问题吗?
本文详细探讨了在阿里面试中常见的问题——“canal+MQ,会有乱序的问题吗?”以及如何保证RocketMQ消息有序。文章首先介绍了消息有序的基本概念,包括全局有序和局部有序,并分析了RocketMQ中实现消息有序的方法。接着,针对canal+MQ的场景,讨论了如何通过配置`canal.mq.partitionsNum`和`canal.mq.partitionHash`来保证数据同步的有序性。最后,提供了多个与MQ相关的面试题及解决方案,帮助读者更好地准备面试,提升技术水平。
阿里面试:canal+MQ,会有乱序的问题吗?
|
6月前
|
机器学习/深度学习 Python 算法
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
最新【Python 百练成钢】时间调整、二进制数、回文素数、字母距离(1),2024年最新2024年阿里Python岗面试必问
|
27天前
|
消息中间件 架构师 Java
阿里面试:秒杀的分布式事务, 是如何设计的?
在40岁老架构师尼恩的读者交流群中,近期有小伙伴在面试阿里、滴滴、极兔等一线互联网企业时,遇到了许多关于分布式事务的重要面试题。为了帮助大家更好地应对这些面试题,尼恩进行了系统化的梳理,详细介绍了Seata和RocketMQ事务消息的结合,以及如何实现强弱结合型事务。文章还提供了分布式事务的标准面试答案,并推荐了《尼恩Java面试宝典PDF》等资源,帮助大家在面试中脱颖而出。
|
1月前
|
SQL 关系型数据库 MySQL
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
尼恩,一位40岁的资深架构师,通过其丰富的经验和深厚的技術功底,为众多读者提供了宝贵的面试指导和技术分享。在他的读者交流群中,许多小伙伴获得了来自一线互联网企业的面试机会,并成功应对了诸如事务ACID特性实现、MVCC等相关面试题。尼恩特别整理了这些常见面试题的系统化解答,形成了《MVCC 学习圣经:一次穿透MYSQL MVCC》PDF文档,旨在帮助大家在面试中展示出扎实的技术功底,提高面试成功率。此外,他还编写了《尼恩Java面试宝典》等资料,涵盖了大量面试题和答案,帮助读者全面提升技术面试的表现。这些资料不仅内容详实,而且持续更新,是求职者备战技术面试的宝贵资源。
阿里面试:MYSQL 事务ACID,底层原理是什么? 具体是如何实现的?
|
1月前
|
Kubernetes 架构师 算法
阿里面试:全国14亿人,统计出重名最多的前100个姓名
文章介绍了如何解决“从全国14亿人的数据中统计出重名人数最多的前100位姓名”的面试题,详细分析了多种数据结构的优缺点,最终推荐使用前缀树(Trie)+小顶堆的组合。文章还提供了具体的Java代码实现,并讨论了在内存受限情况下的解决方案,强调了TOP N问题的典型解题思路。最后,鼓励读者通过系统化学习《尼恩Java面试宝典》提升面试技巧。
阿里面试:全国14亿人,统计出重名最多的前100个姓名
|
1月前
|
存储 缓存 NoSQL
阿里面试题:缓存的一些常见的坑,你遇到过哪些,怎么解决的?
阿里面试题:缓存的一些常见的坑,你遇到过哪些,怎么解决的?
|
2月前
|
缓存 监控 NoSQL
阿里面试让聊一聊Redis 的内存淘汰(驱逐)策略
大家好,我是 V 哥。粉丝小 A 面试阿里时被问到 Redis 的内存淘汰策略问题,特此整理了一份详细笔记供参考。Redis 的内存淘汰策略决定了在内存达到上限时如何移除数据。希望这份笔记对你有所帮助!欢迎关注“威哥爱编程”,一起学习与成长。