【备战秋招】每日一题:3月18日美团春招第二题:题面+题目思路 + C++/python/js/Go/java 带注释

news2024/9/22 11:35:36

2023大厂笔试模拟练习网站(含题解)

www.codefun2000.com
最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。
在这里插入图片描述
提交链接:

https://codefun2000.com/p/P1088

为了更好的阅读体检,可以查看OJ上的题解。进入提交链接,点击右边菜单栏的"查看塔子哥的题解"

目录

1.题面

2.思路

3.类似题目推荐

4.代码

题面

塔子哥是一名设计师,最近接到了一项重要任务:设计一个新款的生日蜡烛,以庆祝公司成立20周年。为了使蜡烛看起来更加炫目,塔子哥计划在蜡烛上缠绕彩带。他买了一串长度为 N N N 的非常漂亮的彩带,每一厘米的彩带上都是一种色彩,但是当他拿到彩带后才发现,彩带上的颜色太多了,超出了他设计中所需要的颜色种类数量。

于是,塔子哥决定从彩带上截取一段,使得这段彩带上的颜色种类不超过 K K K种。但是,他希望这段彩带尽量长,这样才能在蜡烛上缠绕出更加炫目的效果。为了尽快完成设计,他来找你求助,希望你能帮他设计出一种截取方法,使得截取出来的彩带尽可能长,并且颜色种类不超过 K K K种。

输入描述

第一行两个整数 N , K N,K N,K,以空格分开,分别表示彩带有 N N N厘米长,你截取的一段连续的彩带不能超过 K K K种颜色。接下来一行 N N N个整数,每个整数表示一种色彩,相同的整数表示相同的色彩。

1 ≤ N , K ≤ 5000 1≤N,K≤5000 1N,K5000,彩带上的颜色数字介于 [ 1 , 2000 ] [1,2000] [1,2000]之间

输出描述

一行,一个整数,表示选取的彩带的最大长度。

样例 1 1 1

输入

8 3
1 2 3 2 1 4 5 1

输出

5

说明:

最长的一段彩带是 [ 1 , 2 , 3 , 2 , 1 ] [1,2,3,2,1] [12321],共 5 5 5厘米。

思路

step1:双指针

分析:题目要求满足性质:区间内颜色种类不超过 k k k的 最长区间。所以假设固定左端点,右端点从左往右移动的过程中,性质是先满足,后不满足。即性质满足单调性 。一切满足单调性的问题都能用双指针解决。

如何维护上述性质:

1,我们对当前区间维护一个桶来记录每个值出现的次数(可以使用数组或者哈希表来实现)。

2.在右端点移动的过程中,如果新增的这个数没在桶出现过,那么区间种类数+1。

3.在左端点移动的过程中,如果删去的这个数在桶中恰好只出现一次,那么区间种类数-1.

由此,我们就能够正确的维护区间种类数 , 通过它来判断区间合法性。

类似题目推荐

leetcode

  1. 167. 两数之和 II - 输入有序数组
  2. 344. 反转字符串
  3. 283. 移动零
  4. 11. 盛最多水的容器
  5. 剑指 Offer 48. 最长不含重复字符的子字符串
  6. 209. 长度最小的子数组
  7. 493. 翻转对 (难度较高,需要掌握归并排序等高级算法)

CodeFun2000

P1001-华为Od-k优雅阈值

P1007-58同城-2022.11.5-找出符合条件的子字符串

P1071-百度-2023.3.7-第二题-排列数量

代码实现

Python

from collections import defaultdict
# 读入
n , k = list(map(int , input().split()))
a = list(map(int , input().split()))
res = 0
i = 0
j = 0
# 记录每个数出现次数
num_count = defaultdict(int)
# 记录当前区间的不同数的个数
dif = 0
# 双指针 , i 是左端点 , j 是右端点
while j < n:
    #将a[j]放入桶中
    num_count[a[j]] += 1
    # 如果a[j] 从未出现过,则种类++
    if num_count[a[j]] == 1:
        dif += 1
    # 不满足性质,则收缩左端点
    while dif > k:
        # a[i] 出现一次,那么收缩之后没出现,那么种类数--
        if num_count[a[i]] == 1:
            dif -= 1
        num_count[a[i]] -= 1
        i += 1
    # 到这里,我们就获得了<右端点以j为结尾的,最左的,满足性质的左端点i>. 记录答案
    res = max(res , j - i + 1)
    j += 1
print (ans)

C++

#include <iostream>
#include <unordered_map> // 引入无序哈希映射库 
using namespace std;

int main() {
    int n, k;
    // 读入n和k
    cin >> n >> k; 
    // 开辟数组a,长度为n,存储已经读入的数组元素
    int* a = new int[n]; 
    for (int i = 0; i < n; i++) {
        cin >> a[i];
    }
    // 变量res表示当前的答案,i和j分别是左右指针,dif表示当前区间不同数字的个数
    int res = 0, i = 0, j = 0, dif = 0; 
    // 声明一个哈希映射num_count,存储每个数字出现的次数
    unordered_map<int, int> num_count; 
    // 在哈希映射中将a[j]出现的次数加1
    while (j < n) {
        num_count[a[j]]++; 
        // 如果a[j]之前没有出现过
        if (num_count[a[j]] == 1) { 
            // 区间内不同数字的数量+1
            dif++; 
        }
        // 如果区间内不同数字的数量>dif,说明不能满足性质,需要将区间收缩
        while (dif > k) { 
             // 如果a[i]只出现过一次
            if (num_count[a[i]] == 1) {
                // 区间内不同数字的数量-1
                dif--; 
            }
            // 在哈希映射中将a[i]出现的次数减1
            num_count[a[i]]--; 
            // 左指针i右移(收缩)
            i++; 
        }
        // 更新答案,即记录当前区间长度
        res = max(res, j - i + 1); 
        // 右指针j右移
        j++; 
    }
    // 输出当前的答案
    cout << res << endl; 
    // 释放数组a占用的内存
    delete[] a; 
    return 0;
}

Java

import java.util.Scanner;
import java.util.HashMap;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        int k = sc.nextInt();

        int[] a = new int[n];
        for (int i = 0; i < n; i++) {
            a[i] = sc.nextInt();
        }

        int res = 0, i = 0, j = 0, dif = 0;
        HashMap<Integer, Integer> num_count = new HashMap<>();

        while (j < n) {
            int cur = a[j];
            num_count.put(cur, num_count.getOrDefault(cur, 0) + 1);
            // 如果a[j]从未出现过,则种类++
            if (num_count.get(cur) == 1) { 
                dif++;
            }
            // 不满足性质,则收缩左端点
            while (dif > k) { 
                int c = a[i];
                // a[i]出现一次,则种类数--
                if (num_count.get(c) == 1) { 
                    dif--;
                }
                num_count.put(c, num_count.get(c) - 1);
                i++;
            }
            // 记录答案
            res = Math.max(res, j - i + 1); 
            j++;
        }

        System.out.println(res);
    }
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
    input += data;
    return;
});
process.stdin.on('end', () => {
    const lines = input.trim().split('\n');
    let [n, k] = lines[0].trim().split(' ').map(Number);
    let a = lines[1].trim().split(' ').map(Number);

    let res = 0;
    let i = 0;
    let j = 0;
    // 记录每个数出现次数
    let numCount = new Map();
    // 记录当前区间的不同数的个数
    let dif = 0;
    // 双指针 , i 是左端点 , j 是右端点
    while (j < n) {
        //将a[j]放入桶中
        numCount.set(a[j], (numCount.get(a[j]) || 0) + 1);
        // 如果a[j] 从未出现过,则种类++
        if (numCount.get(a[j]) === 1) {
            dif += 1;
        }
        // 不满足性质,则收缩左端点
        while (dif > k) {
            // a[i] 出现一次,那么收缩之后没出现,那么种类数--
            if (numCount.get(a[i]) === 1) {
                dif -= 1;
            }
            numCount.set(a[i], numCount.get(a[i]) - 1);
            i += 1;
        }
        // 到这里,我们就获得了<右端点以j为结尾的,最左的,满足性质的左端点i>. 记录答案
        res = Math.max(res, j - i + 1);
        j += 1;
    }
    console.log(res); // 输出答案
});

Go

package main

import "fmt"

func main() {
    var n, k int
    fmt.Scan(&n, &k)
    a := make([]int, n)
    for i := 0; i < n; i++ {
        fmt.Scan(&a[i])
    }

    numCount := make(map[int]int)
    res, i, j, dif := 0, 0, 0, 0
    for j < n {
        cur := a[j]
        numCount[cur]++
        if numCount[cur] == 1 { // 如果a[j]从未出现过,则种类++
            dif++
        }

        for dif > k { // 不满足性质,则收缩左端点
            c := a[i]
            if numCount[c] == 1 {  // a[i]出现一次,则种类数--
                dif--
            }
            numCount[c]--
            i++
        }

        res = max(res, j-i+1) // 记录答案
        j++
    }

    fmt.Println(res)
}

func max(a, b int) int { // 自定义max函数
    if a > b {
        return a
    }
    return b
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547335.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深入理解递归算法

文章目录 概述单路递归 Single RecursionE01. 阶乘E02. 反向打印字符串E03. 二分查找 多路递归 Multi RecursionE01. 斐波那契数列 递归优化-记忆法递归优化-尾递归递归时间复杂度-Master theorem递归时间复杂度-展开求解 概述 定义 计算机科学中&#xff0c;递归是一种解决计…

Unity UI -- (5)增加基础按钮功能

分析分析一些常见UI 良好的UI设计会清晰地和用户沟通。用户知道他们能和屏幕上哪些东西交互&#xff0c;哪些不能。如果他们进行了交互&#xff0c;他们也要清楚地知道交互是否成功。换句话说&#xff0c;UI要提供给用户很多反馈。 我们可以来看看在Unity里或者在计算机上的任何…

一款适合国内多场景的免费ChatGPT镜像网站【建议收藏】

随着人工智能技术的不断进步&#xff0c;智能问答系统正逐渐成为我们生活中必不可少的助手。而在这个领域中&#xff0c;ChatGPT中文版-知否AI问答凭借其出色的性能和广泛的应用场景&#xff0c;成为了引领智能问答新时代的重要代表。本文将带您深入了解ChatGPT中文版-知否AI问…

LabVIEWCompactRIO 开发指南25 实施LabVIEW FPGA代码的方法

LabVIEWCompactRIO 开发指南25 实施LabVIEW FPGA代码的方法 开始开发时&#xff0c;应在LabVIEW项目的FPGA目标下创建VI&#xff0c;以便使用LabVIEW FPGA选板进行编程&#xff0c;该选板是LabVIEW选板的子集&#xff0c;包括一些LabVIEW FPGA特定函数。 应该在仿真模式下开…

每日一个MySQL知识点:主从表大小相差巨大和一个BUG

一、主从相同表空间相差巨大 1.1 问题描述 我们知道MySQL主从基本上是逻辑的复制&#xff0c;那么有少量的空间差异没有问题&#xff0c;但是本案例主库表只有10G&#xff0c;但是从库表有100G&#xff0c;这么大的差距比较少见&#xff0c;需要分析原因。 1.2 问题分析 实…

ResNet (深度残差网络)

ResNet 算法概述 解决的核心问题&#xff1a;网络的退化现象 网络层数在变深之后&#xff0c;性能不如浅层时候的性能 。注意&#xff1a;网络退化既不是梯度消失也不是梯度爆炸。 那是如何解决退化现象的呢&#xff1f;引入残差模块 把模型的输入分成两条路&#xff1a;右边…

SQL 大全(四)|数据库迁移升级时常用 SQL 语句

作者 | JiekeXu 来源 |公众号 JiekeXu DBA之路&#xff08;ID: JiekeXu_IT&#xff09; 如需转载请联系授权 | (个人微信 ID&#xff1a;JiekeXu_DBA) 大家好&#xff0c;我是 JiekeXu,很高兴又和大家见面了,今天和大家一起来看看SQL 大全&#xff08;四&#xff09;|数据库迁移…

由浅入深了解 深度神经网络优化算法

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 导言 优化是从一组可用的备选方案中选择最佳方案。优化无疑是深度学习的核心。基于梯度下降的方法已经成为训练深度神经网络的既定方法。 在最简单的情况下&#xff0c;优化问题包括通过系统地从允许集合中…

Jenkins+GitLab+Docker搭建前端自动化构建镜像容器部署

前言 &#x1f680; 需提前安装环境及知识点&#xff1a; 1、Docker搭建及基础操作 2、DockerFile文件描述 3、Jenkins搭建及基础点 &#x1f680; 目的&#xff1a; 将我们的前端项目打包成一个镜像容器并自动发布部署&#xff0c;可供随时pull访问 一、手动部署镜像及容器 1…

6-《网络面试》

6-《网络面试》 1.http是什么&#xff1f;http的工作机制&#xff1f;http报文&#xff1f;1.1 http工作机制&#xff1a;1.2 URL和http报文 2. HTTP请求方法和状态码3.Get和Post的区别4.HTTP的Header解析1.text/html2.x-www-form-urlencoded3.multipart/form-data4.applicatio…

中断相关概念并利用中断实现按键点亮LED灯

一.中断相关概念 什么是中断&#xff1f; 中断是指计算机运行过程中&#xff0c;出现某些意外情况需主机干预时&#xff0c;机器能自动停止正在运行的 程序并转入处理新情况的程序&#xff0c;处理完毕后又返回原被暂停的程序继续运行。 什么是EXTI&#xff1f; 外部…

【vue上传文件——hash】

vue上传文件 要求:只能上传视频,先计算文件的hash值,hash值一样则不需要上传,不一样在执行上传 分析:因为el-upload没有找到合适的属性,本次用的是原生的input的type属性为file上传 代码: html: 通过点击选取文件按钮调用input上传 js 第一步:点击上传文件先效验是否…

windows下免U盘安装manjaro

建议 建议先看这个https://www.bilibili.com/read/cv23161386/ 背景 新到了一块硬盘&#xff0c;想把这台主机做成双系统的&#xff0c;windowsmanjaro系统。 为什么选择manjaro&#xff1f; win中的虚拟机已经有了日常使用的ubuntu。体验一下manjaro。ubuntu用来开发办公要…

python 之 logging的使用

一、日志模块 import logginglogging.debug("调试日志") logging.info(消息日志) logging.warning("告警日志") logging.error(错误日志) logging.critical(严重错误日志)debug&#xff08;调试&#xff09;级别用于输出调试信息&#xff0c;这些信息主…

JDK源码阅读环境搭建

本次针对jdk8u版本的搭建 1.新建项目 新建java项目JavaSourceLearn &#xff0c;这里我创建的是maven 2.获取JDK源码 打开Project Structure 找到本地JDK安装位置将src.zip解压到项目java包中 整理下项目结构&#xff0c;删除用不到的目录 提示: 添加源码到项目之后首次运行…

【BBQ: A Hand-Built Bias Benchmark for Question Answering 论文精读】

BBQ: A Hand-Built Bias Benchmark for Question Answering 论文精读 InformationAbstract1 Introduction2 Related Work3 The Dataset3.1 Coverage3.2 Template Construction3.3 Vocabulary4 Validation5 Evaluation6 Results7 Discussion8 Conclusion9 Ethical Consideration…

keepalived+nginx搭建高可用kubeadm1.25

实验环境 系统都是centos 7 IP地址主机名称192.168.0.1k8s-master01192.168.0.2k8s-master02192.168.0.3k8s-master03192.168.0.230k8s-vip192.168.0.4k8s-node01192.168.0.5k8s-node02 所有节点修改主机名称 cat <<EOF >> /etc/hosts 192.168.0.1 k8s-master0…

python 容器

容器 Python中&#xff0c;可包含其他对象的对象&#xff0c;称之为“容器”。容器是一种数据结构。 常用的容器主要划分为两种&#xff1a;序列&#xff08;如&#xff1a;列表、元祖等&#xff09;和映射&#xff08;如&#xff1a;字典&#xff09;。序列中&#xff0c;每个…

国考省考行测:百分点和百分数,相对量和绝对量的比较

国考省考行测&#xff1a;百分点和百分数 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能&#xff0c;附带行测和申论&#xff0c;而常规国考省考最重要的还是申论和行测&#xff0c;所以大家认真准备吧&#xff0c;我讲一起屡屡申论和行测的重要知识…

MyBatis扩展

目录 单元测试 spring boot的单元测试 spring boot的单元测试的使用 1.在要测试的类里,右键点击生成 2.点击test 3.配置测试的信息,点击ok 4.在生成的测试类里,加注解,写测试代码 5.运行单元测试 6.查看测试结果 追加测试方法 断言 MyBatis 单表传参查询 MyBatis获取…