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

相关文章
|
11月前
|
存储 关系型数据库 MySQL
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
阿里面试:MySQL 一个表最多 加几个索引? 6个?64个?还是多少?
|
10月前
|
监控 Java 数据安全/隐私保护
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
阿里面试:SpringBoot启动时, 如何执行扩展代码?你们项目 SpringBoot 进行过 哪些 扩展?
|
9月前
|
负载均衡 架构师 Cloud Native
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选 CP 还是 AP?为什么?
阿里面试:服务与发现 ,该选  CP 还是 AP?为什么?
|
存储 关系型数据库 MySQL
阿里面试:为什么要索引?什么是MySQL索引?底层结构是什么?
尼恩是一位资深架构师,他在自己的读者交流群中分享了关于MySQL索引的重要知识点。索引是帮助MySQL高效获取数据的数据结构,主要作用包括显著提升查询速度、降低磁盘I/O次数、优化排序与分组操作以及提升复杂查询的性能。MySQL支持多种索引类型,如主键索引、唯一索引、普通索引、全文索引和空间数据索引。索引的底层数据结构主要是B+树,它能够有效支持范围查询和顺序遍历,同时保持高效的插入、删除和查找性能。尼恩还强调了索引的优缺点,并提供了多个面试题及其解答,帮助读者在面试中脱颖而出。相关资料可在公众号【技术自由圈】获取。
|
监控 Kubernetes Java
阿里面试:5000qps访问一个500ms的接口,如何设计线程池的核心线程数、最大线程数? 需要多少台机器?
本文由40岁老架构师尼恩撰写,针对一线互联网企业的高频面试题“如何确定系统的最佳线程数”进行系统化梳理。文章详细介绍了线程池设计的三个核心步骤:理论预估、压测验证和监控调整,并结合实际案例(5000qps、500ms响应时间、4核8G机器)给出具体参数设置建议。此外,还提供了《尼恩Java面试宝典PDF》等资源,帮助读者提升技术能力,顺利通过大厂面试。关注【技术自由圈】公众号,回复“领电子书”获取更多学习资料。
|
10月前
|
SQL Java 数据库连接
阿里腾讯互联网公司校招 Java 面试题总结及答案解析
本文总结了阿里巴巴和腾讯等互联网大厂的Java校招面试题及答案,涵盖Java基础、多线程、集合框架、数据库、Spring与MyBatis框架等内容。从数据类型、面向对象特性到异常处理,从线程安全到SQL优化,再到IOC原理与MyBatis结果封装,全面梳理常见考点。通过详细解析,帮助求职者系统掌握Java核心知识,为校招做好充分准备。资源链接:[点击下载](https://pan.quark.cn/s/14fcf913bae6)。
386 2
|
存储 NoSQL Redis
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 + 无锁架构 + EDA架构 + 异步日志 + 集群架构
阿里面试:Redis 为啥那么快?怎么实现的100W并发?说出了6大架构,面试官跪地: 纯内存 + 尖端结构 +  无锁架构 +  EDA架构  + 异步日志 + 集群架构
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer
例如,在一个有 10 个节点的系统中,增加一个新节点,只会影响到该新节点在哈希环上相邻的部分数据,其他大部分数据仍然可以保持在原节点,大大减少了数据迁移的工作量和对系统的影响。狠狠卷,实现 “offer自由” 很容易的, 前段时间一个武汉的跟着尼恩卷了2年的小伙伴, 在极度严寒/痛苦被裁的环境下, offer拿到手软, 实现真正的 “offer自由”。在 3 - 5 年的中期阶段,随着业务的稳定发展和市场份额的进一步扩大,订单数据的增长速度可能会有所放缓,但仍然会保持在每年 20% - 30% 的水平。
阿里面试:每天新增100w订单,如何的分库分表?这份答案让我当场拿了offer