【阿里淘天笔试题汇总】2024-04-03-阿里淘天春招笔试题(第一套)-三语言题解(CPP/Python/Java)

🍭 大家好这里是KK爱Coding ,一枚热爱算法的程序员

✨ 本系列打算持续跟新淘天近期的春秋招笔试题汇总~

💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导

👏 感谢大家的订阅➕ 和 喜欢💗

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

文章目录

    • 01.LYA 的独特字符串
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 02.卢小姐的城市之旅
      • 题目描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 样例解释
      • 数据范围
      • 题解
      • 参考代码
    • 03.卢小姐的元素调整之旅
      • 问题描述
      • 输入格式
      • 输出格式
      • 样例输入
      • 样例输出
      • 数据范围
      • 题解
      • 参考代码
    • 写在最后
    • 📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

01.LYA 的独特字符串

问题描述

LYA 有一个由 n n n 个小写字母组成的字符串 s s s。她想从中选出 k k k 个字符,使得这 k k k 个字符组成的子串中不同字符的个数最多。

请你帮助 LYA 计算,在最优方案下,这个子串中最多有多少个不同的字符。

输入格式

第一行包含两个正整数 n n n k k k,分别表示字符串 s s s 的长度和要选择的字符个数。

第二行包含一个长度为 n n n 的字符串 s s s,仅由小写字母组成。

输出格式

输出一个整数,表示在最优方案下,选出的 k k k 个字符组成的子串中不同字符的最大个数。

样例输入

7 4
abacaba

样例输出

3

数据范围

  • 1 ≤ k ≤ n ≤ 1 0 5 1 \leq k \leq n \leq 10^5 1kn105
  • 字符串 s s s 仅由小写字母组成

题解

这个问题可以转化为从字符串 s s s 中选择 k k k 个字符,使得选出的字符集合的大小最大。

我们可以用一个集合(set)来维护当前选择的字符集合,遍历字符串 s s s,将每个字符加入集合,直到选择了 k k k 个字符为止。最终集合的大小即为最多能得到的不同字符数。

如果字符串 s s s 中不同字符的总数小于 k k k,那么答案就是 s s s 中不同字符的总数。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( k ) O(k) O(k)

参考代码

  • Python
n, k = map(int, input().split())
s = input()
chars = set()
for c in s:chars.add(c)if len(chars) == k:break
print(len(chars))
  • Java
import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));String[] line = br.readLine().split(" ");int n = Integer.parseInt(line[0]);int k = Integer.parseInt(line[1]);String s = br.readLine();Set<Character> chars = new HashSet<>();for (char c : s.toCharArray()) {chars.add(c);if (chars.size() == k) {break;}}System.out.println(chars.size());}
}
  • Cpp
#include <iostream>
#include <string>
#include <unordered_set>
using namespace std;int main() {int n, k;string s;cin >> n >> k >> s;unordered_set<char> chars;for (char c : s) {chars.insert(c);if (chars.size() == k) {break;}}cout << chars.size() << endl;return 0;
}

02.卢小姐的城市之旅

题目描述

卢小姐计划去旅行,她要走遍 n n n 个城市。从一个城市到相邻的城市需要消耗 1 1 1 单位的体力。每个城市都有特色美食,每份售价为 a i a_i ai,卢小姐可以在每个城市购买任意份美食。

卢小姐想要用最少的花费走完全程,但是她希望每个城市的美食不要吃太多,即在一个城市重复进餐的次数的最大值最小。

卢小姐想知道一种满足上述条件的美食购买方案。如果有多种方案,输出任意一种即可。

输入格式

第一行输入一个整数 n n n 1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105),表示城市个数。

第二行输入 n n n 个整数,表示每个城市的美食售价 a i a_i ai 1 ≤ a i ≤ 1 0 5 1 \le a_i \le 10^5 1ai105)。

输出格式

输出一行整数,表示每个城市购买的美食份数。

样例输入

4
1 2 1 4

样例输出

2 0 1 0

样例解释

在第 1 1 1 个城市购买 2 2 2 份美食,花费 2 2 2
在第 2 2 2 个城市购买 0 0 0 份美食,花费 0 0 0
在第 3 3 3 个城市购买 1 1 1 份美食,花费 1 1 1
在第 4 4 4 个城市购买 0 0 0 份美食,花费 0 0 0

此时总花费为 3 3 3,在同一个城市重复进餐次数的最大值为 2 2 2(第 1 1 1 个城市)。

数据范围

1 ≤ n ≤ 1 0 5 1 \le n \le 10^5 1n105
1 ≤ a i ≤ 1 0 5 1 \le a_i \le 10^5 1ai105

题解

本题可以使用贪心 + 优先队列来解决,即所谓反悔贪心

我们可以维护一个优先队列,存储每个城市的美食售价和当前在该城市进餐的次数。每次从优先队列中取出售价最低且进餐次数最少的城市,在该城市多购买一份美食,然后将其重新插入优先队列。重复这个过程直到到达最后一个城市。

这样做的正确性在于,我们总是选择售价最低且进餐次数最少的城市购买美食,可以尽量均匀地分配进餐次数,从而使得在同一个城市重复进餐次数的最大值最小。

时间复杂度为 O ( n log ⁡ n ) O(n \log n) O(nlogn),空间复杂度为 O ( n ) O(n) O(n)

参考代码

  • Python
import heapqn = int(input())
a = list(map(int, input().split()))pq = [(a[i], 0, i) for i in range(n)]
heapq.heapify(pq)ans = [0] * n
for _ in range(n - 1):price, cnt, idx = heapq.heappop(pq)ans[idx] += 1heapq.heappush(pq, (price, cnt + 1, idx))print(*ans)
  • Java
import java.util.*;class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int[] a = new int[n];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}PriorityQueue<int[]> pq = new PriorityQueue<>((x, y) ->x[0] != y[0] ? x[0] - y[0] : x[1] - y[1]);for (int i = 0; i < n; i++) {pq.offer(new int[]{a[i], 0, i});}int[] ans = new int[n];for (int i = 0; i < n - 1; i++) {int[] top = pq.poll();ans[top[2]]++;pq.offer(new int[]{top[0], top[1] + 1, top[2]});}for (int x : ans) {System.out.print(x + " ");}}
}
  • Cpp
#include <iostream>
#include <queue>
#include <vector>
using namespace std;typedef pair<int, pair<int, int>> PII;int main() {int n;cin >> n;vector<int> a(n);for (int i = 0; i < n; i++) {cin >> a[i];}priority_queue<PII, vector<PII>, greater<PII>> pq;for (int i = 0; i < n; i++) {pq.emplace(a[i], make_pair(0, i));}vector<int> ans(n);for (int i = 0; i < n - 1; i++) {auto top = pq.top();pq.pop();int price = top.first, cnt = top.second.first, idx = top.second.second;ans[idx]++;pq.emplace(price, make_pair(cnt + 1, idx));}for (int x : ans) {cout << x << " ";}return 0;
}

03.卢小姐的元素调整之旅

问题描述

K小姐和A先生在玩一款名为“元素调整”的游戏。K小姐有一串宝石,每颗宝石都有一个能量值。为了保持宝石的和谐,K小姐希望通过调整能量值,使得她的宝石串中的能量值不递减,并且每颗宝石的能量值必须与A先生提供的宝石能量值匹配。

K小姐可以通过施加魔法来增加或减少宝石的能量值(每次操作改变 1 1 1 单位能量)。她想知道,为了达到目标,最少需要施展多少次魔法。

输入格式

第一行包含两个正整数 n , m n, m n,m,分别表示 K小姐和 A先生宝石串的长度。

第二行共 n n n 个空格分开的正整数 a 1 , a 2 , … , a n a_1, a_2, \ldots, a_n a1,a2,,an,表示 K小姐宝石串的初始能量值。

第三行共 m m m 个空格分开的正整数 b 1 , b 2 , … , b m b_1, b_2, \ldots, b_m b1,b2,,bm,表示 A先生宝石串的能量值。

输出格式

输出一个整数,表示 K小姐达到目标所需的最少魔法施展次数。

样例输入

5 4
3 5 3 8 10
1 2 3 4

样例输出

12

数据范围

1 ≤ n , m ≤ 2 × 1 0 3 1 \leq n, m \leq 2 \times 10^3 1n,m2×103

1 ≤ a i , b i ≤ 1 0 9 1 \leq a_i, b_i \leq 10^9 1ai,bi109

题解

要使 K小姐的宝石串能量值不递减且每颗宝石的能量值都存在于 A先生的宝石串中,我们可以采用动态规划的方法。我们定义状态 d p [ i ] [ j ] dp[i][j] dp[i][j] 为考虑到 K小姐的前 i i i 颗宝石,并且第 i i i 颗宝石的能量调整为 A先生宝石串中第 j j j 颗的能量值时,所需的最小魔法施展次数。状态转移方程为:

d p [ i ] [ j ] = min ⁡ ( d p [ i − 1 ] [ j ] , d p [ i − 1 ] [ j − 1 ] ) + ∣ a i − b j ∣ dp[i][j] = \min(dp[i-1][j], dp[i-1][j-1]) + |a_i - b_j| dp[i][j]=min(dp[i1][j],dp[i1][j1])+aibj

最终答案为 min ⁡ 1 ≤ j ≤ m d p [ n ] [ j ] \min_{1 \leq j \leq m}{dp[n][j]} min1jmdp[n][j]

参考代码

  • Python
INF = float('inf')n, m = map(int, input().split())
a = list(map(int, input().split()))
b = list(map(int, input().split()))b.sort()dp = [[INF] * (m + 1) for _ in range(n + 1)]
for j in range(m + 1):dp[0][j] = 0for i in range(1, n + 1):for j in range(1, m + 1):val = abs(a[i - 1] - b[j - 1])dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1]) + valans = min(dp[n])
print(ans)
  • Java
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int INF = Integer.MAX_VALUE;int n = sc.nextInt(), m = sc.nextInt();int[] a = new int[n];int[] b = new int[m];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}for (int i = 0; i < m; i++) {b[i] = sc.nextInt();}Arrays.sort(b);int[][] dp = new int[n + 1][m + 1];for (int[] row : dp) {Arrays.fill(row, INF);}for (int j = 0; j <= m; j++) {dp[0][j] = 0;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {int val = Math.abs(a[i - 1] - b[j - 1]);dp[i][j] = Math.min(dp[i - 1][j], dp[i - 1][j - 1]) + val;}}int ans = Arrays.stream(dp[n]).min().orElse(INF);System.out.println(ans);}
}
  • Cpp
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main() {const int INF = 1e9;int n, m;cin >> n >> m;vector<int> a(n), b(m);for (int i = 0; i < n; i++) {cin >> a[i];}for (int i = 0; i < m; i++) {cin >> b[i];}sort(b.begin(), b.end());vector<vector<int>> dp(n + 1, vector<int>(m + 1, INF));for (int j = 0; j <= m; j++) {dp[0][j] = 0;}for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {int val = abs(a[i - 1] - b[j - 1]);dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1]) + val;}}int ans = *min_element(dp[n].begin(), dp[n].end());cout << ans << endl;return 0;
}

写在最后

📧 KK这边最近正在收集近一年互联网各厂的笔试题汇总,如果有需要的小伙伴可以关注后私信一下 KK领取,会在飞书进行同步的跟新。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[RK3588-Android12] 调试MIPI-双通道-压缩屏(Video Mode/MIPI Dphy 8Lane/DSC 144HZ)

问题描述 被测屏幕&#xff1a;小米Pad6 分辨率&#xff1a;1800X2880 模式&#xff1a;Video Mode/MIPI Dphy 8Lane/DSC 144HZ PPS: 11 00 00 89 30 80 0B 40 03 84 00 14 01 C2 01 C2 02 00 01 F4 00 20 01 AB 00 06 00 0D 05 7A 06 1A 18 00 10 F0 03 0C 20 00 06 0B 0B 33…

[Leetcode笔记] 动态规划相关

前言 写题目写到了一些和动态规划相关的内容&#xff0c;所以在这里记录一下 LCR 089 题解思路 总的来说&#xff0c;就是用一个数组去存储当前的最优解&#xff0c;然后从0开始一路向上顺推过去&#xff0c;求得最后一位的最优解。 class Solution { public:int rob(vect…

k8s calico由IPIP模式切换为BGP模式

按照官网calico.yaml部署后&#xff0c;默认是IPIP模式 查看route -n &#xff0c; 看到是tunl0口进行转发 怎么切换到BGP模式呢&#xff1f; kubectl edit ippool 将ipipMode由Always修改为Never &#xff0c;修改后保存文件即可。无需做任何操作&#xff0c;自动就切换为BG…

公众号爆文策略与实践:揭秘千万阅读量的秘密

1. 引言 介绍公众号爆文的重要性&#xff0c;以及分享个人通过每天投入半小时赚到30倍门票的经验。强调跟上大佬步伐&#xff0c;提升认知的重要性。 2. 爆文的底层逻辑 2.1 推荐的底层逻辑 内容分发机制的变化&#xff0c;从仅限于直接关注到通过搜索、浏览推荐等多种方式…

【详解】Windows系统安装Nginx及简单使用

【详解】Windows系统安装Nginx及简单使用 一、Nginx是什么&#xff1f; “Nginx 是一款轻量级的 HTTP 服务器&#xff0c;采用事件驱动的异步非阻塞处理方式框架&#xff0c;这让其具有极好的 IO 性能&#xff0c;时常用于服务端的反向代理和负载均衡。”Nginx 是一款 http 服…

实景三维:城市数据要素的新维度

引言 在数字化转型的大潮中&#xff0c;数据已成为推动社会发展的关键要素。实景三维技术&#xff0c;作为一种新兴的数据表达形式&#xff0c;正在成为城市数据要素中不可或缺的一部分。它不仅丰富了数据的类型&#xff0c;更为城市规划、管理和服务提供了全新的视角。本文将…

N1912A安捷伦N1912A功率计

181/2461/8938产品概述&#xff1a; 安捷伦N1912A双通道P系列宽带功率传感器为R&D和制造工程师提供精确和可重复的功率测量&#xff0c;应用市场包括航空航天和国防&#xff08;雷达&#xff09;、无线通信和无线802.11a/b/g网络。该仪表/传感器组合提供的测量包括峰值功率…

QT-自定义参数设计框架软件

QT-自定义参数设计框架软件 前言一、演示效果二、使用步骤1.应用进行参数注册2.数据库操作单例对象3.参数操作单例对象 三、下载链接 前言 常用本地数据参数通常使用的是xml等文本的格式&#xff0c;进行本地的数据参数的存储。这种参数的保存方式有个致命的一点&#xff0c;就…

基于单片机20v数字电压表仿真系统设计

**单片机设计介绍&#xff0c;基于单片机20v数字电压表仿真系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机20V数字电压表仿真系统设计的主要目标是实现一个能够准确测量和显示20V直流电压的仿真系统。以下是该设计的主…

Sy6 编辑器vi的应用(+shell脚本3例子)

实验环境&#xff1a; 宿主机为win11&#xff0c;网络&#xff1a;10.255.50.5 6389 WSL2 ubuntu 目标机的OS&#xff1a;Ubuntu 内核、版本如下&#xff1a; linuxpeggy0223:/$ uname -r 5.15.146.1-microsoft-standard-WSL2 linuxpeggy0223:/$ cat /proc/version Linux vers…

VMware创建Ubuntu虚拟机详细教程

下载ISO映像文件 进入官网下载&#xff1a;Download Ubuntu Desktop | Download | Ubuntu 下面是一些其他的下载路径&#xff1a; 中国官网 https://cn.ubuntu.com/ 中科大源 Index of /ubuntu-releases/ (ustc.edu.cn) 阿里云开源镜像站 ubuntu-releases安装包下载_开源镜像…

真·面试题总结——JVM虚拟机

JVM虚拟机 JVM虚拟机规范与实现 JVM虚拟机规范 JVM虚拟机实现 JVM的常见实现 JVM虚拟机物理架构 JVM虚拟机的运转流程 JVM类加载过程 JVM类加载器及类加载器类型 JVM类加载器双亲委派机制 JVM运行时数据区的内存模型 JVM运行时数据区的内存模型&#xff1a;程序计数器…

day08 java 静态方法调用 方法的内存实现机制

目录 静态方法调用 方法的内存实现 静态方法调用 静态方法&#xff1a; 静态方法要在方法上用修饰符static。 静态方法可以通过类名调用 &#xff1a;类名.方法名&#xff08;&#xff09;或者 直接调用 &#xff1a;方法名&#xff08;&#xff09; 在同一个类中时&#xf…

网工内推 | 国企运维,IA认证,大专以上即可,最高22K

01 深圳建广数字科技有限公司青岛分公司 招聘岗位&#xff1a;桌面运维工程师 职责描述&#xff1a; 1.根据运维服务请求完成关于操作系统、应用软件、办公设备、网络等方面的安装、管理与维护&#xff1b; 2.各种PC软硬件故障诊断、排查及升级&#xff1b; 3.桌面设备&…

自动化测试如何管理测试数据

前段时间&#xff0c;知识星球里有同学问到&#xff1a;自动化case越多&#xff0c;测试数据越多&#xff0c;数据的管理成本也越来越高&#xff0c;是否需要一个数据池来专门管理测试数据&#xff1f;这是一个好问题&#xff0c;也是很多测试同学在自动化测试实践中必须面对的…

新手使用GIT上传本地项目到Github(个人笔记)

亲测下面的文章很有用处。 1. 初次使用git上传代码到github远程仓库 - 知乎 (zhihu.com) 2. 使用Git时出现refusing to merge unrelated histories的解决办法 - 知乎

Lua环境下载与配置

这里介绍如何下载已经编译好的Lua环境&#xff0c;如何配置Lua环境。 如希望自己从源码编译Lua环境&#xff0c;请自行搜索资料。 第一步&#xff1a;下载编译好的lua环境 打开下面链接&#xff0c;然后根据指引下载。 The Programming Language Luahttps://www.lua.org/hom…

【论文极速读】 指令微调BLIP:一种对指令微调敏感的Q-Former设计

【论文极速读】 指令微调BLIP&#xff1a;一种对指令微调敏感的Q-Former设计 FesianXu 20240330 at Tencent WeChat search team 前言 之前笔者在[1]中曾经介绍过BLIP2&#xff0c;其采用Q-Former的方式融合了多模态视觉信息和LLM&#xff0c;本文作者想要简单介绍一个在BLIP2…

docker 安装nginx

一、先查看有没有nginx镜像 docker images 二、发现没有nginx镜像&#xff0c;下载最新镜像 docker pull nginx 三、运行镜像 为了先复制出部分文件&#xff0c;先启动一个临时容器 docker run --name nginx -p 9001:80 -d nginx docker cp nginx:/etc/nginx/conf.d /home/…

HTTP/1.1、HTTP/2、HTTP/3 演变(计算机网络)

HTTP/1.1 相比 HTTP/1.0 提高了什么性能&#xff1f; HTTP/1.1 相比 HTTP/1.0 性能上的改进&#xff1a; 使用长连接改善了短连接造成的性能开销。支持管道网络传输&#xff0c;只要第一个请求发出去了&#xff0c;不必等其回来&#xff0c;就可以发第二个请求出去&#xff0c…