小红书机考真题- 避重口令 (Java/Py/C/C++/Js/Go)

SpringBoot支持动态更新配置文件参数 本文介绍SpringBoot在不重启服务的前提下动态刷新配置参数的实现方案。文章通过自定义DynamicPropertyUpdater与ConfigFileReloader组件,结合Environment属性源操作,实现单个配置项更新、批量更新以及重新加载整个配置文件,并给出接口测试步骤与效果验证。 阅读详情

小红书机考真题- 避重口令

整理历年互联网大厂机考、机试真题与面试真题,覆盖校招、实习招聘等常见求职场景,包含高频算法题、编程题、机考题及面试题,并提供完整代码、解题思路、代码详解和在线 OJ 练习,方便系统刷题和备战大厂技术面试。

点击查看完整题库目录:互联网大厂历年机考机试与面试真题题库|代码详解+在线OJ

题目描述

短视频审核后台要把已过审成片的标题按发布时间依次拼接,得到小写字符串 S。S 的每一个子序列(含 S 本身与空串)都被视为已经占用的口令,不能再给新专题使用。

求最短的、不是 S 子序列的小写口令长度。

子序列:从原串中删除任意个(可以为零个)字符后,剩余字符保持相对顺序所形成的串。

输入描述

一行,仅含小写字母的字符串 S(1≤∣S∣≤10^5)。

输出描述

一行一个正整数,即最短未占用口令的长度。

示例1

输入

zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba

输出

3

说明

S 由两段倒序的 26 个小写字母拼接而成。任意单个字母、任意长度为 2 的小写串都是 S 的子序列(前半段取第一个字符、后半段取第二个字符即可)。S 中字母 a 只出现两次,故 aaa 不是子序列,最短长度为 3。

解题思路

核心思想

把字符串从左到右尽量早地切分:每当当前片段第一次集齐 26 个小写字母,就结束这一层,并从下一个字符重新收集。

假设最终得到 k 个完整层。每个完整层都至少包含一次 a 到 z,因此任意长度为 k 的小写字符串,都可以让第 i 个字符在第 i 层中找到,必然是 S 的子序列。所以答案至少为 k + 1。

另一方面,记每一层最后补齐的字母为该层的“收尾字母”。由于这一层是在该字符处第一次集齐 26 种字母,所以该收尾字母在本层此前没有出现。依次取每层的收尾字母,再取一个未出现在最后残余片段中的字母,可构造出一个长度为 k + 1、无法成为 S 子序列的口令。因此答案恰好是 k + 1。

算法步骤

  1. 准备一个集合或长度为 26 的布尔数组,记录当前层已经出现的字母。
  2. 从左到右扫描 S,将当前字符加入本层。
  3. 当前层集齐 26 种字母时,完整层数加一,并清空记录。
  4. 扫描结束后输出“完整层数 + 1”。

复杂度分析

  • 时间复杂度:O(n),每个字符只处理一次。
  • 空间复杂度:O(1),只维护 26 个字母的出现状态。

Java

import java.util.Scanner;

public class Main {
    static int solve(String text) {
        boolean[] appeared = new boolean[26];
        int distinctCount = 0;
        int completeLayers = 0;

        for (int i = 0; i < text.length(); i++) {
            // 当前层首次遇到某个字母时,更新已收集的不同字母数量
            int index = text.charAt(i) - 'a';
            if (!appeared[index]) {
                appeared[index] = true;
                distinctCount++;
            }

            // 集齐 26 个字母后形成一层,下一字符开始重新收集
            if (distinctCount == 26) {
                completeLayers++;
                appeared = new boolean[26];
                distinctCount = 0;
            }
        }

        // 完整层数是可覆盖的最大万能长度,答案需要再加一
        return completeLayers + 1;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String text = scanner.nextLine().trim();
        System.out.println(solve(text));
        scanner.close();
    }
}

Python

def solve(text):
    appeared = set()
    complete_layers = 0

    for ch in text:
        # 当前层记录已经出现过的不同小写字母
        appeared.add(ch)

        # 集齐 26 个字母就完成一层,并从下一字符重新收集
        if len(appeared) == 26:
            complete_layers += 1
            appeared.clear()

    # 完整层数是所有等长口令都能成为子序列的最大长度
    return complete_layers + 1


def main():
    text = input().strip()
    print(solve(text))


if __name__ == "__main__":
    main()

JavaScript

const readline = require('readline');

function solve(text) {
    const appeared = new Array(26).fill(false);
    let distinctCount = 0;
    let completeLayers = 0;

    for (const ch of text) {
        // 当前层首次遇到某个字母时,更新不同字母数量
        const index = ch.charCodeAt(0) - 97;
        if (!appeared[index]) {
            appeared[index] = true;
            distinctCount++;
        }

        // 集齐 26 个字母后完成一层,并清空状态继续扫描
        if (distinctCount === 26) {
            completeLayers++;
            appeared.fill(false);
            distinctCount = 0;
        }
    }

    // 最短未占用口令长度比完整层数多一
    return completeLayers + 1;
}

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    terminal: false
});

rl.once('line', (line) => {
    console.log(solve(line.trim()));
    rl.close();
});

C++

#include <array>
#include <iostream>
#include <string>
using namespace std;

int solve(const string& text) {
    array<bool, 26> appeared{};
    int distinctCount = 0;
    int completeLayers = 0;

    for (char ch : text) {
        // 当前层首次遇到某个字母时,更新不同字母数量
        int index = ch - 'a';
        if (!appeared[index]) {
            appeared[index] = true;
            distinctCount++;
        }

        // 集齐 26 个字母后完成一层,并从下一字符重新收集
        if (distinctCount == 26) {
            completeLayers++;
            appeared.fill(false);
            distinctCount = 0;
        }
    }

    // 完整层数加一就是最短未占用口令长度
    return completeLayers + 1;
}

int main() {
    string text;
    cin >> text;
    cout << solve(text) << '\n';
    return 0;
}

Go

package main

import (
    "bufio"
    "fmt"
    "os"
)

func solve(text string) int {
    appeared := [26]bool{}
    distinctCount := 0
    completeLayers := 0

    for _, ch := range text {
        // 当前层首次遇到某个字母时,更新不同字母数量
        index := int(ch - 'a')
        if !appeared[index] {
            appeared[index] = true
            distinctCount++
        }

        // 集齐 26 个字母后完成一层,并清空状态继续扫描
        if distinctCount == 26 {
            completeLayers++
            appeared = [26]bool{}
            distinctCount = 0
        }
    }

    // 最短未占用口令长度比完整层数多一
    return completeLayers + 1
}

func main() {
    in := bufio.NewReader(os.Stdin)
    var text string
    fmt.Fscan(in, &text)
    fmt.Println(solve(text))
}

C语言

#include <stdbool.h>
#include <stdio.h>
#include <string.h>

int solve(const char *text) {
    bool appeared[26] = {false};
    int distinctCount = 0;
    int completeLayers = 0;

    for (int i = 0; text[i] != '\0'; i++) {
        // 当前层首次遇到某个字母时,更新不同字母数量
        int index = text[i] - 'a';
        if (!appeared[index]) {
            appeared[index] = true;
            distinctCount++;
        }

        // 集齐 26 个字母后完成一层,并清空状态继续扫描
        if (distinctCount == 26) {
            completeLayers++;
            memset(appeared, 0, sizeof(appeared));
            distinctCount = 0;
        }
    }

    // 完整层数加一就是最短未占用口令长度
    return completeLayers + 1;
}

int main(void) {
    char text[100005];
    if (scanf("%100000s", text) != 1) {
        return 0;
    }
    printf("%d\n", solve(text));
    return 0;
}

完整用例

用例1

zyxwvutsrqponmlkjihgfedcbazyxwvutsrqponmlkjihgfedcba

用例2

a

用例3

abcdefghijklmnopqrstuvwxyz

用例4

abcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxyabcdefghijklmnopqrstuvwxy

用例5

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabc

用例6

abcdefghijklmnopqrstuvwxyazbcdefghijklmnopqrstuvwxyz

用例7

zyxwvutsrqponmlkjihgfedcbaabcdefghijklmnopqrstuvwxyz

用例8

abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzmnop

用例9

aaaaaaaaaa

用例10

qwertyuiopasdfghjklzxcvbnm

互联网大厂真题

麒麟系统无法进入单用户模式该怎么办? 🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。 阅读详情

相关推荐

K-Means聚类算法 — 算法原理、质心计算、距离度量、聚类效果评价及优缺点

分类知识   分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中。机器学习中常见的分类算法有:SVM(支持向量机)、KNN(最邻近法)、Decision Tree(决策树分类法)、Naive Bayes(朴素贝叶斯分类)、Neural Networks(神经网络法)等。   但当对海量数据进行分类时,为了降低数据满足分类算法要求所需要的预处理代价,往往需要选...

zhf的博客 1万+

小红书机考真题- 最小化峰值干扰 (Java/Py/C/C++/Js/Go)

小红书机考真题- 最小化峰值干扰 (Java/Py/C/C++/Js/Go)

算法大师! 251

Windows Server 搭建ftp服务

Windows Server 搭建ftp服务

ch258563的博客 1009

小红书机考真题- 待发热度重排 (Java/Py/C/C++/Js/Go)

小红书机考真题- 待发热度重排 (Java/Py/C/C++/Js/Go)

算法大师! 200

告别卡顿!用AVPro Video在Unity 2022.3里流畅播放4K视频的保姆级配置流程

本文详细介绍了如何在Unity 2022.3中使用AVPro Video插件实现4K视频的流畅播放。从环境配置、插件选型到核心性能优化技巧,包括解码器设置、内存管理策略和多平台适配方案,帮助开发者彻底解决卡顿问题,提升视频播放体验。

weixin_32349561的博客 309

PMOS缓启动电路设计实战:用LTspice优化上电时序,把60A冲击降到15A

本文通过一个实战案例,深入解析了PMOS缓启动电路如何有效抑制上电冲击电流。文章指出,低ESR电容是导致冲击电流飙升的元凶,并详细阐述了利用LTspice仿真工具,通过优化栅极电阻和栅源电容等参数,将高达60A的冲击电流成功降至15A的设计与优化过程,为电源开关电路设计提供了可复用的方法论。

onion的博客 890

小红书机考真题- 加速窗口收益 (Java/Py/C/C++/Js/Go)

小红书机考真题- 加速窗口收益 (Java/Py/C/C++/Js/Go)

算法大师! 178

Proteus仿真实战:基于IIC驱动SSD1306的0.96英寸OLED显示方案解析

本文详细解析了在Proteus仿真环境中基于IIC驱动SSD1306的0.96英寸OLED显示方案。从硬件搭建、IIC接口连接、软件驱动移植到常见问题排查,提供了全面的实战指导,帮助开发者快速实现OLED显示功能并优化性能。

weixin_28724661的博客 768

小红书机考真题- 专栏改挂后的最大综合评分 (Java/Py/C/C++/Js/Go)

# 小红书机考真题- 专栏改挂后的最大综合评分 整理历年**互联网大厂机考、机试真题与面试真题**,覆盖校招、实习招聘等常见求职场景,包含高频算法题、编程题、机考题及面试题,并提供**完整代码、解题思路、代码详解和在线 OJ 练习**,方便系统刷题和备战大厂技术面试。

算法大师! 232

Planet explorer:免费获取高分辨率影像的网站

该软件提供了高质量的卫星图像和地形数据,用户可以使用该软件来查看地球上任何地方的详细地图信息,包括地形、道路、建筑物等。在接下来的30天里,你可以点击应用顶部的切换按钮,在新的和当前的应用之间进行切换。如果在你感兴趣的地区没有高分辨率图像,可以通过我们的SkySat卫星为你采购。如果你还没有与我们的50厘米图像合作,请在这里下载我们的高分辨率图像样本,或联系销售,在你的合同中增加任务访问。你可以在 "我的订单 "中订购你的数据以供下载。你也可以点击双方按钮,将图像的足迹锁定在地图上,以获得更好的。

此星光明博客 1673

[网络安全提高篇] 一二九.Powershell恶意代码检测 (5)混淆和反混淆 [上]

前文介绍了如何利用MS Defender实现恶意样本家族批量标注。这篇文章将继续讲解Powershell恶意代码检测,主要包括PowerShell混淆与反混淆内容,首先结合Invoke-Obfuscation工具详细介绍PowerShell代码混淆方法,再结合PowerDecode工具阐述解混淆方法。该研究将为后续的恶意软件家族分类或溯源提供帮助。未完待续,基础性文章,希望您喜欢,且看且珍惜。

杨秀璋的专栏 1487

静态脱敏系统技术趋势分析

静态脱敏系统技术趋势分析要回答的不是买了哪些新功能,而是哪些能力正在变成出厂默认。本文从确定性脱敏、规则版本化、可逆受控与导出验签四条线,拆解趋势判断的可复算落点,并给出采购方可以直接核对的清单。

xingxiuer的博客 267

Transformer 跨界物理建模:探索模拟动态物理系统方法与实践(PINN、流体力学、有限元)

是一个由 Nicholas Zabaras 团队开发的开源项目,托管于 GitHub,旨在将 Transformer 模型(最初在自然语言处理领域大获成功)应用于物理系统的建模与预测。该项目基于论文 ​*“Transformers for Modeling Physical Systems”*​(Neural Networks, 2022),探索了深度学习中的 Transformer 架构如何通过自注意力机制和 Koopman 嵌入来模拟动态物理系统。

源代码杀手的博客 1179

Maven 下载与配置教程(新手友好版)

本文档手把手教你在 Windows 系统上安装和配置 Maven,全程从官方渠道下载,安全可靠。

qq_36085846的博客 248

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

构造函数表达式的值类别是:prvalue

C++ 中构造表达式 T() 的结果为 prvalue,因其本质是“对象的初始化配方”而非已有对象。这一设计使编译器能强制执行复制消除(C++17起),直接在目标位置构造对象,实现零开销优化。即使类型不可拷贝或不可移动,也能合法初始化。同时,prvalue绑定引用时物化为xvalue,延长生命周期。该机制清晰区分初始化、移动与持久对象,是返回值优化和高效资源管理的语言基础。

jimy1的博客 481

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

LeetCode100 1.两数之和

暴力枚举法时间复杂度为O(n²),空间O(1),直观但效率低。优雅解法利用HashMap,遍历中先查补数、后存当前值,平均时间复杂度O(n),空间O(n)。虽最坏情况(哈希冲突严重)理论可达O(n²),但Java 8+中链表超过8个元素转为红黑树,最坏退化至O(n log n),实际性能优异。

Shaoxingzong的博客 300

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

生产环境 Tomcat 200 线程跑满并报连接池超时:一次虚拟线程阻塞点排查

开启虚拟线程后线程告警消失,HikariCP 连接池超时却更早出现。先用 JFR 事件排除 `synchronized` 阻塞,再按并发预算重算连接池容量。

昨日种种,皆成今我。今日种种,皆成新我。 324

移动端 CPU 调度分析:线程亲和性、大小核迁移与卡顿

移动端卡顿常非代码瓶颈,而是调度问题。线程迁移、缓存失效、优先级反转、队列竞争等会显著增加等待时间,使相同工作耗时上升。需通过调度时间线区分运行与等待成本,分析核心类别、频率变化、锁状态及线程池负载。验证应控制变量,避免误判。修复关键在优化同步、控线程数、调优先级,而非盲目绑核。

m0_59437018的博客 247

DDD(领域驱动设计)篇四:退费 + 支付,三层 vs DDD 各撸一遍

DDD 不是一门新技术,而是一种纪律——业务规则集中放、用业务的语言放、放在划清的边界内。三层架构没有错,它只是没有回答"规则放哪"这个问题;DDD 回答了,代价是多写几个类、多学几个概念。 代码会写了,再读书就不抽象了。推荐顺序: 《实现领域驱动设计》(Vaughn Vernon,"红书")——比原著(蓝书)好读得多,先读前半部分; 蓝书挑着读:只读"统一语言""限界上下文"两章。

Good good study,day day up 71

欧盟电子发票(XRechnung/Peppol/ZUGFeRD)踩坑记:用 Python 不装 Java 跑官方校验规则

德法比推行企业间结构化电子发票(EN 16931)。本文讲金额怎么算才能过校验、怎么用 Python + saxonche 不装 Java 跑 XRechnung/Peppol 官方 Schematron,以及 Leitweg-ID 校验位这类官方规则查不到的坑,并介绍开源工具 eu-einvoice。

weixin_38859100的博客 237

Spring Boot的配置文件

本文介绍了Spring Boot中配置文件的使用,重点对比了application.properties与application.yml两种格式。properties为键值对形式,注释易乱码;yml语法更简洁,支持层级结构,优先级高于properties。通过@Value、@ConfigurationProperties可读取配置项,后者支持对象绑定。配置文件需统一格式,避免冲突。同时介绍了配置项读取流程及注解使用注意事项。

captain376的博客 240

若依项目新建业务模块

本文介绍了在若依框架中新建业务子模块的完整步骤:通过Maven创建子模块,引入ruoyi-framework依赖;在父工程中锁定子模块版本;在ruoyi-admin中添加依赖并刷新Maven;最后重启项目即可成功加载新模块。图文结合,清晰展示操作流程,确保模块集成顺利。

weixin_50379372的博客 158

基于 Spring Cloud Alibaba 的微服务架构设计与落地实践

本文介绍基于Spring Cloud Alibaba的微服务架构方案,整合Nacos、Sentinel、Seata、RocketMQ等组件,实现服务注册发现、配置管理、流量防护、分布式事务与消息驱动。通过统一版本管理、四层分层架构与按业务拆分的服务设计,结合Feign实现服务调用,配合动态配置刷新与降级容错,构建高可用、可扩展的微服务系统。

薛之谦 202

LeetCode Hot 100 · 双指针 3 题 Java

LeetCode Hot 100 · 双指针 3 题,覆盖 11 盛最多水的容器、15 三数之和、42 接雨水,主线是排序 / 双指针 / 前缀最值与「短板效应」。

2401_88612756的博客 355

《On Java 中文版 基础卷》阅读笔记 实现隐藏 11

《On Java 中文版 基础卷》阅读笔记 实现隐藏 11

道友 166

第 3 篇:Ubuntu 配置 JDK 17 环境

本文介绍在 Ubuntu 24.04 上通过 APT 安装并配置 OpenJDK 17 的完整流程。包括查看可用版本、安装 JDK 17、验证安装、设置 JAVA_HOME 环境变量(推荐使用 /etc/profile.d/java.sh 方式)、多版本切换及测试程序验证。步骤简洁稳定,适用于开发与部署 Spring Boot 等 Java 应用场景。

John_DHui的博客 231
上一篇: 9.16华为OD机试真题 新系统 - 统计特殊数字 (Java/Py/C/C++/Js/Go)
下一篇: 小红书机考真题- 专栏改挂后的最大综合评分 (Java/Py/C/C++/Js/Go)
算法大师
算法大师 新星创作者: 算法与数据结构技术领域 新星创作者: 算法与数据结构技术领域
博客等级 码龄5年 1万+粉丝 1658原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

算法大师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值