淘天集团Java开放岗暑期实习笔试(2025年4月2日)
摘要:
除3道笔试题外,还有10道单选、5道不定项、2道Java单选、1道Java不定项选择题,笔试时长100分组,整体难度很大。三道算法题本人全部没有AC(惭愧),事后总结至此。
第一道算法题,常规的质数判别的算法(2~sqrt(num))在我其它步骤都没有错误的情况下导致了时间复杂度过超!经过查询资料,找到了6的倍数两侧判别法作为替代,兴许能够通过(?
第二道算法题,像是一道数论问题,原谅笔者答题时着急忙慌外加没有竞赛经历,对于这类数论题目束手无策。经过事后查询资料和分析,得到了一种可能的数学归纳解法。
第三道算法题,到此题时时间已经不多,然而此题思路其实简单,主要考察的是对字符串操作的掌握,通过定长数组记录字符频次的方式,可将构造内部排序的前缀串的时间复杂度降到O(n*26)(实际上就是O(n)),然后再经过O(nlogn)的排序算法得到最终结果。大厂笔试环境下的Java是JDK1.8的,Arrays.sort()和Collections.sort()方法都是默认支持的,放心用!
1.质数组个数
题目分析:
题目描述:
给定两个长度为n的正整数数组a和b,现在将两者合并成数组c,其中c_i = a_i + b_i,问数组c中有多少个质数组?
质数组定义:一个连续子数组中的每个数都是质数。
输入描述:
第一行是n
第二行是a数组的用空格隔开的n个数
第三行是b数组的用空格隔开的n个数
输出描述:
输出一行,包含一个整数,表示符合条件的质数组个数。
解题思路:
用双指针法标定质数子数组的边界。初始化左指针l为0,不断移动左指针直至找到质数,然后令右指针r=l,不断移动右指针r直至指向的数不为质数,此时得到一段质数区间的长度为r - l,那么可以得到2^(r-l) - 1个质数组,并更新左指针l到右指针r所指向处然后重复上述步骤,直至遍历完全。
关于素数判定的算法,对于比1大的正整数num,遍历从2~Math.sqrt(num)的整数,检验num是否能被整除,如果能被整除则不是质数,否则是质数。
时间复杂度分析:
双指针法遍历数组c的时间复杂度为O(n),判断质数的操作的时间复杂度为O(√m),m是数组c中的最大值。得到总的时间复杂度为O(n√m)。
然而,这样的时间复杂度还是过不了本题的运行时间要求,经过调试,可以确定是判断质数的操作时间复杂度过大导致的超时!!!
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);// 读取数组长度 nint n = scanner.nextInt();int[] a = new int[n];// 读取数组 a 的元素for (int i = 0; i < n; i++) {a[i] = scanner.nextInt();}// 合并数组 a 和 b 得到数组 cint[] c = new int[n];for (int i = 0; i < n; i++) {c[i] = a[i] + scanner.nextInt();}int count = 0;// 记录质数组个数int l = 0;// 记录返回值while (l < n) {// 找到第一个质数while (l < n &&!isPrime(c[l])) {l++;}int r = l;// 找到质数区间的结束位置while (r < n && isPrime(c[r])) {r++;}// count += (int)Math.pow(2, r-l) - 1;count += (1 << (r-l)) - 1 // 更高效l = r;}System.out.println(count);scanner.close();}// 判断一个数是否为质数public static boolean isPrime(int num) {if (num < 2) {return false;}for (int i = 2; i <= Math.sqrt(num); i++) {if (num % i == 0) {return false;}}return true;}
}
时间复杂度优化:6的倍数两侧判断法
如果一个数是质数(除了2和3),那么一定在6的倍数的两侧。
public static boolean isPrime(int num) {if (num == 1) {return false;}if (num == 2 || num == 3) {return true;}if (num % 2 == 0 || num % 3 == 0) {return false;}/*if (num % 6 != 1 && num % 6 != 5) {return false;// 与上一个if等价}*/for (int i = 5; i * i <= num; i += 6) {if (num % i == 0 || num % (i + 2) == 0) {return false;}}return true;}
2.正方形问题
题目分析:
题目描述:
给定a个1×1的正方形和b个2×2的正方形,尝试将他们拼成一个大正方形,在大正方形中,每个部位仅有一个小正方形,且没有小正方形重叠。要求判别给定的a+b个小正方形能否组成一个大正方形。
输入描述:
第一行是一个整数T,表示有T组测试数据。
每组测试数据有一行,是两个用空格隔开的正整数,分别表示a和b。
输出描述:
每组测试数据有一个输出,占一行,如果判别结果为能,输出"YES",否则输出"NO"。
解题思路:
a+b个小正方形能够组成大正方形,则对于总面积S=a+b*4,必然存在一个整数d,使得d^2 = S,如果不存在,那么直接返回"NO"。
现在,我们得到了大正方形的边长d。
根据边长d的奇偶性,分别处理:
- 偶数边长,最大能放置的2×2正方形个数为 maxB = S / 4 - 1(由于边长是偶数,即2的倍数,那么总面积一定能被4整除),之所以减去1,是因为a不为0,要留出至少1个2*2的网格给1×1的小正方形,此时a是4的倍数。
- 奇数边长,可以把大正方形看作是一个边长为偶数的子正方形和一些额外的行或列组成。我们可以想象,子偶数边长正方形的边长为m = d - 1,那么最大能放置的maxB的个数为maxB = m * m / 4,这种情况下额外的行和列有2m + 1个格子,即对应奇数个1×1的小正方形。
思路简化:由于总面积符合大正方形,则只需2×2的小正方形不越界即可。
从而得到代码如下:
import java.util.Scanner;public class Main {public static boolean canFormSquare(int a, int b) {int S = a + 4 * b;int d = (int) Math.sqrt(S);if (d * d != S) {return false;}if (d % 2 == 0) {int maxB = S / 4 - 1;return b <= maxB && a % 4 == 0;} else {int m = d - 1;int maxB = m * m / 4;return b <= maxB && a % 2 == 1;}}public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int T = scanner.nextInt();for (int i = 0; i < T; i++) {int a = scanner.nextInt();int b = scanner.nextInt();if (canFormSquare(a, b)) {System.out.println("YES");} else {System.out.println("NO");}}scanner.close();}
}
3.第k小的前缀串
题目分析:
题目描述:
给定一个长度为n的仅由小写字母组成的字符串s,对于任意的0 <= i <= n-1,区间为[0, i]的子串都是字符串s的前缀串。
现在将这n个前缀串按如下规则排序:
- 先在每个前缀串内部,将其字符按照字典序升序排列
- 然后在各个前缀串之间,将他们按照字典序升序排列
对于任意的两个字符串,从头开始逐个比较其字符,如果一个字符串已结束而另一个字符串还有余,仍未分出大小,则长度较短的这个字符串按字典序排在前面。
给定一个整数k(1 <= k <= n),求这样排序后第k小的前缀串。
输入描述:
第一行是一个正整数T,表示有T组测试数据。
每组测试数据的第一行是两个用空格隔开的整数,分别是n和k;
每组测试数据的第二行是一个长度为n的仅有小写字符组成的字符串s。
输出描述:
每组测试数据的输出占一行,即第k小的前缀串。
解题思路:
这道题主要考察的是字符串的操作。由于字符串仅由小写字符组成,我们可以用一个长度为26的整型数组记录前缀串中不同字符的频次,从而在O(n*26)的时间复杂度内,构造n个前缀串。
至于不同前缀串之间的排序,由于直到遍历完所有前缀串之前都无法确定最终的顺序,所以必将有一个时间复杂度为O(nlogn)的排序算法对n个前缀串进行按字典排序。
时间复杂度分析:
构造前缀串:O(n*26);按字典排序前缀串:O(nlogn)。
最终得到时间复杂度为O(nlogn)的算法。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int T = scanner.nextInt();for (int t = 0; t < T; t++) {int n = scanner.nextInt();int k = scanner.nextInt();scanner.nextLine();String s = scanner.nextLine();String result = findKthSmallestPrefix(s, k);System.out.println(result);}scanner.close();}public static String findKthSmallestPrefix(String s, int k) {int n = s.length();List<String> prefixes = new ArrayList<>();int[] count = new int[26];for (int i = 0; i < n; i++) {char c = s.charAt(i);count[c - 'a']++;StringBuilder sortedPrefix = new StringBuilder();for (int j = 0; j < 26; j++) {for (int l = 0; l < count[j]; l++) {sortedPrefix.append((char) ('a' + j));}}prefixes.add(sortedPrefix.toString());}Collections.sort(prefixes);return prefixes.get(k - 1);}
}相关文章:
淘天集团Java开放岗暑期实习笔试(2025年4月2日)
摘要: 除3道笔试题外,还有10道单选、5道不定项、2道Java单选、1道Java不定项选择题,笔试时长100分组,整体难度很大。三道算法题本人全部没有AC(惭愧),事后总结至此。 第一道算法题,…...
关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容
以下是关于 数据库 UNION 和 UNION ALL 的使用,以及 分库分表环境下多表数据组合后的排序和分页问题的解决方案 的详细说明,并以表格总结关键内容: 1. UNION 和 UNION ALL 的核心区别 1.1 定义与语法 UNION 功能:合并两个或多个 …...
【接口重复请求】axios通过AbortController解决页面切换过快,接口重复请求问题
处理网络请求时,我们经常会遇到需要中途取消请求的情况,比如用户在两个tab之间反复横跳的场景,如果每个接口都从头请求到结束,那必然会造成很大的服务压力。 AbortController是一个Web API,它提供了一个信号对象&…...
论文阅读:基于增强通用深度图像水印的混合篡改定位技术 OmniGuard
一、论文信息 论文名称:OmniGuard: Hybrid Manipulation Localization via Augmented Versatile Deep Image Watermarking作者团队:北京大学发表会议:CVPR2025论文链接:https://arxiv.org/pdf/2412.01615二、动机与贡献 动机: 随着生成式 AI 的快速发展,其在图像编辑领…...
Flutter极速接入IM聊天功能并支持鸿蒙
Flutter极速接入IM聊天功能并支持鸿蒙 如果你们也是Flutter项目,想快速接入聊天,包括聊天的UI界面,强烈推荐这一家。因为我们已经完成了集成,使用非常稳定,集成也非常快捷方便。 而且,就在今天,…...
深挖 DeepSeek 隐藏玩法·智能炼金术2.0版本
前引:屏幕前的你还在AI智能搜索框这样搜索吗?“这道题怎么写”“苹果为什么红”“怎么不被发现翘课” ,。看到此篇文章的小伙伴们!请准备好你的思维魔杖,开启【霍格沃茨模式】,看我如何更新秘密的【知识炼金…...
C语言数组知识点
一、数组的基本概念 1.定义 数组是相同数据类型元素的集合,通过连续内存存储,支持高效访问。 核心特点: 元素类型相同 内存连续分配 通过下标访问(从 0 开始) 2.分类 一维数组:线性结构(如…...
【新手初学】SQL注入getshell
一、引入 木马介绍: 木马其实就是一段程序,这个程序运行到目标主机上时,主要可以对目标进行远程控制、盗取信息等功能,一般不会破坏目标主机,当然,这也看黑客是否想要搞破坏。 木马类型: 按照功…...
DAY 34 leetcode 349--哈希表.两个数组的交集
题号349 我尝试硬解失败 /*class Solution {public int[] intersection(int[] nums1, int[] nums2) {int n1nums1.length;int n2nums2.length;int sizeMath.min(n1,n2);int []arrnew int[size];int count0;for(int i0;i<n1;i){outerloop:for(int j0;j<n2;j){if(nums1[i…...
Qt常用宏定义判断大全
Qt 提供了一系列预定义宏用于判断 Qt 版本、操作系统平台、编译器特性等。这些宏在跨平台开发中非常有用。 1. Qt 版本判断宏 // 检查Qt版本 #if QT_VERSION > QT_VERSION_CHECK(5, 15, 0)// Qt 5.15.0及以上版本特有代码 #endif// 常用版本判断 #if QT_VERSION > QT_V…...
tsconfig.json:error TS6306: Referenced project ‘/tsconfig.node.json‘
这是TypeScript配置文件中的错误。具体有两个问题: 错误TS6306:引用的项目/tsconfig.node.json必须设置"composite": true错误TS6310:引用的项目tsconfig.node.json不能禁用emit 要解决这些问题,需要修改tsconfig.nod…...
14-SpringBoot3入门-MyBatis-Plus之CRUD
1、整合 13-SpringBoot3入门-整合MyBatis-Plus-CSDN博客 2、表 3、crud package com.sgu;import com.sgu.mapper.UserMapper; import com.sgu.pojo.User; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.spri…...
前端面试常考算法题目详解
根据2025年最新前端面试趋势,结合腾讯、阿里等大厂真题,我为你整理了以下高频算法题型及JS实现方案: 一、数组/字符串处理 1. 两数之和(哈希表法) 问题:找出数组中两数之和等于目标值的索引 const twoSu…...
三轴云台之相机技术篇
一、结构设计 三轴云台通常由空间上三个互相垂直的框架构成,包括内框(俯仰框)、中框(方位框)和外框(横滚框)。这些框架分别负责控制相机的俯仰运动、方位运动和横滚运动,从而实现对目…...
质量和工艺之间的区别与联系?
我们生活中常常会遇到这些现象:冰箱漏水,修手机,电脑死机卡死,空调不制冷等等一些现象,我相信99%用户的第一反应是产品的质量不太行对吧! 其实不然,站在专业分析角度,难道冰箱漏水就一定是质量的问题吗? 不一定,小编认为要根本原因出发考虑,冰箱漏水了,可能和工艺…...
Bugku-再也没有纯白的灵魂
下载文件发现是兽音先用https://roar.iiilab.com/加密flag 得到“~呜嗷嗷嗷嗷呜啊嗷啊呜呜嗷呜呜~嗷嗷~啊嗷啊呜嗷嗷~嗷~嗷~呜呜嗷呜啊啊”,与密文对比对比发现字段少个啊,并且B对应嗷,U对应呜,G对应啊,K对应~补充啊后…...
推导Bias² + Variance + σ²_ε
问题的背景 我们有一个真实函数 f ( x ) f(x) f(x) 和基于训练数据 D D D 训练得到的模型 f ^ ( x ; D ) \hat{f}(x;D) f^(x;D)。对于任意输入 x x x: y y y 是真实的观测值,定义为 y f ( x ) ϵ y f(x) \epsilon yf(x)ϵ,其中 …...
多模态大语言模型arxiv论文略读(一)
Does Transliteration Help Multilingual Language Modeling? ➡️ 论文标题:Does Transliteration Help Multilingual Language Modeling? ➡️ 论文作者:Ibraheem Muhammad Moosa, Mahmud Elahi Akhter, Ashfia Binte Habib ➡️ 研究机构: Pennsyl…...
单元测试原则之——不要模拟不属于你的类型
在单元测试中,不要模拟不属于你的类型(Don’t mock types you don’t own)是一个重要的原则。这是因为外部库或框架的类型(如第三方依赖)可能会在未来的版本中发生变化,而你的模拟可能无法反映这些变化,从而导致测试失效。 以下是一个基于Java Mockito 的示例,展示如何…...
算法与数据结构面试题
算法与数据结构面试题 加油! 考查数据结构本身 什么是数据结构 简单地说,数据结构是以某种特定的布局方式存储数据的容器。这种“布局方式”决定了数据结构对于某些操作是高效的,而对于其他操作则是低效的。首先我们需要理解各种数据结构&a…...
边缘检测技术现状初探2:多尺度与形态学方法
一、多尺度边缘检测方法 多尺度边缘检测通过在不同分辨率/平滑度下分析图像,实现: 粗尺度(大σ值):抑制噪声,提取主体轮廓细尺度(小σ值):保留细节,检测微观…...
【AI News | 20250402】每日AI进展
AI Repos 1、Dolphin 由数据海洋AI与清华大学联合研发的Dolphin多任务语音识别模型正式亮相。该模型覆盖东亚、南亚、东南亚及中东地区40余种语言,并支持22种汉语方言,训练数据量超21万小时(含自有及开源数据),具备语…...
大智慧前端面试题及参考答案
如何实现水平垂直居中? 在前端开发中,实现元素的水平垂直居中是一个常见的需求,以下是几种常见的实现方式: 使用绝对定位和负边距:将元素的position设置为absolute,然后通过top、left属性将其定位到父元素的中心位置,再使用负的margin值来调整元素自身的偏移,使其水平垂…...
LLM 分词器Tokenizer 如何从 0 到 1 训练出来
写在前面 大型语言模型(LLM)处理的是人类的自然语言,但计算机本质上只能理解数字。Tokenizer(分词器) 就是架在自然语言和计算机数字表示之间的一座至关重要的桥梁。它负责将我们输入的文本字符串分解成模型能够理解的最小单元——Token,并将这些 Token 转换成对应的数字…...
操作系统高频(七)虚拟地址与页表
操作系统高频(六)虚拟地址与页表 1.什么是文件系统?它的作用是什么?⭐ 存储管理:文件系统负责管理计算机的存储设备,如硬盘、固态硬盘等。它将文件存储在这些设备上,并负责分配和回收存储空间…...
openEuler24.03 LTS下安装Flume
目录 前提条件 下载Flume 解压 设置环境变量 修改日志文件 测试Flume 在node2安装Flume 前提条件 Linux安装好jdk Flume一般需要配合Hadoop使用,安装好Hadoop完全分布式集群,可参考:openEuler24.03 LTS下安装Hadoop3完全分布式 下载F…...
现代几何风格网页标牌标识logo海报标题设计psai英文字体安装包 Myfonts – Gilroy Font Family
Gilroy 是一款具有几何风格的现代无衬线字体。它是原始 Qanelas 字体系列的弟弟。它有 20 种粗细、10 种直立字体和与之匹配的斜体。Light 和 ExtraBold 粗细是免费的,因此您可以随心所欲地使用它们。设计时考虑到了强大的 opentype 功能。每种粗细都包括扩展语言支…...
ControlNet-Tile详解
一、模型功能与应用 1. 模型功能 ControlNet-Tile模型的主要功能是图像的细节增强和质量提升。它通过以下几个步骤实现这一目标: 语义分割:模型首先对输入的图像进行语义分割,识别出图像中不同的区域和对象。这一步是为了让模型理解图像的内…...
leetcode 2873. 有序三元组中的最大值 I
欢迎关注更多精彩 关注我,学习常用算法与数据结构,一题多解,降维打击。 文章目录 题目描述题目剖析&信息挖掘解题思路方法一 暴力枚举法思路注意复杂度代码实现 方法二 公式拆分动态规划思路注意复杂度代码实现 题目描述 [2873] 有序三元…...
Java创建对象和spring创建对象的过程和区别
暮乘白帝过重山 从new到IoC的演进,体现了软件工程从"怎么做"到"做什么"的思维转变。理解Java对象创建的底层机制,是写出高性能代码的基础;掌握Spring的Bean管理哲学,则是构建可维护大型系统的关键。二者如同…...
