秋招突击——9/10、9\11——算法练习——携程笔试练习——2024年秋招第一批笔试

文章目录

    • 引言
    • 笔试准备
      • 2024年秋招研发第一批
        • 第一题
        • 第二题
          • 第二次实现
        • 第三题
        • 第四题
        • 第五题
          • 参考实现
    • 总结

引言

  • 准备全力冲携程,好好做算法,去线下面试!
  • 今天就好好做做携程往年的笔试!

笔试准备

2024年秋招研发第一批

第一题

在这里插入图片描述

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息public class Main {public static boolean isPrime(int n) {for (int i = 2; i <= Math.sqrt(n); i ++) {if (n % i == 0)  return false;}return true;}static int res;static boolean[] visited;public static void dfs(int n, int idx, List<Integer> temp) {if (idx == n) {// 已经到达了终点,直接添加对应的元素res ++;// System.out.println(temp.toString());return;}for (int i = 1; i <= n; i ++) {if (!visited[i]) {// 没有访问过if (temp.isEmpty() || !isPrime(i  + temp.get(temp.size() - 1))) {visited[i] = true;temp.add(i);dfs(n, idx + 1, temp);temp.remove(temp.size() - 1);visited[i] = false;}}}}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint n = in.nextInt();visited = new boolean[n + 1];dfs(n, 0, new ArrayList<Integer>());System.out.println(res);}}
}

总结

  • 明明是一个dfs,还是比较简单的dfs,但是有很多细节没注意到位,很难受!

在这里插入图片描述

第二题

在这里插入图片描述
在这里插入图片描述

import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static boolean judge(int[] a,int[] b,int[] c) {// 判断是否为对应符合条件的三个点if((a[0] == b[0] && a[1] == c[1]) || (a[0] ==c[0] && a[1] == b[1])) return true;if((b[0] == a[0] && b[1] == c[1]) || (b[0] ==c[0] && b[1] == a[1])) return true;if((c[0] == b[0] && c[1] == a[1]) || (c[0] ==a[0] && c[1] == b[1])) return true;return false;}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint m = in.nextInt();int n = in.nextInt();char[][] chars = new char[m][n];List<int[]> listY = new ArrayList<>();List<int[]> listO = new ArrayList<>();List<int[]> listU = new ArrayList<>();for(int i = 0;i < m;i ++){String str = in.next();chars[i] = str.toCharArray();for(int j = 0;j < chars[i].length;j ++){if(chars[i][j] == 'y') listY.add(new int[]{i,j});if(chars[i][j] == 'o') listO.add(new int[]{i,j});if(chars[i][j] == 'u') listU.add(new int[]{i,j});}}// 开始具体的逻辑处理int count = 0;for(int[] pointY : listY){for(int[] pointO:listO){for(int[] pointU:listU){if(judge(pointY,pointO,pointU)) {count ++;}}}}System.out.println(count );}}
}

在这里插入图片描述
总结

  • 仅仅通过三组,这里直接暴力,可以使用dp做一下,下次再试试看,因为每一个中心点,都要记录一下之前有多少u、o和y,明天再做
第二次实现
  • 计算每一行或者每一列的前n项的y、o、u的累加和,然后在计算乘积就行了!
import java.util.*;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static boolean judge(int[] a, int[] b, int[] c) {// 判断是否为对应符合条件的三个点if ((a[0] == b[0] && a[1] == c[1]) || (a[0] == c[0] &&a[1] == b[1])) return true;if ((b[0] == a[0] && b[1] == c[1]) || (b[0] == c[0] &&b[1] == a[1])) return true;if ((c[0] == b[0] && c[1] == a[1]) || (c[0] == a[0] &&c[1] == b[1])) return true;return false;}public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextInt()) { // 注意 while 处理多个 caseint m = in.nextInt();int n = in.nextInt();char[][] chars = new char[m][n];int[][] rowCount = new int[m][3];  // 0表示y,1表示o,2表示uint[][] colCount = new int[n][3];  // 0表示y,1表示o,2表示u// 这个是遍历的标签for (int i = 0; i < m; i ++) {String str = in.next();chars[i] = str.toCharArray();for (int j = 0; j < chars[i].length; j ++) {if (chars[i][j] == 'y') {rowCount[i][0] ++;colCount[j][0] ++;}if (chars[i][j] == 'o') {rowCount[i][1] ++;colCount[j][1] ++;}if (chars[i][j] == 'u') {rowCount[i][2] ++;colCount[j][2] ++;}}}// 开始具体的逻辑处理long count = 0;for (int i = 0; i < m; i ++) {for (int j = 0; j < n; j ++) {if (chars[i][j] == 'y') {count = count + rowCount[i][1] * colCount[j][2] + rowCount[i][2] *colCount[j][1] ;}if (chars[i][j] == 'o') {count = count + rowCount[i][0] * colCount[j][2] + rowCount[i][2] *colCount[j][0] ;}if (chars[i][j] == 'u') {count = count + rowCount[i][1] * colCount[j][0] + rowCount[i][0] *colCount[j][1] ;}}}System.out.println(count );}}
}

在这里插入图片描述

第三题
  • 编写一个SQL查询,返回每个商品的销售总量,先按照商品类别升序排序,再按销售总量降序排列,同时包括商品名称和销售总量。此外,还需要在结果中包含每个商品在其所属类别内的排名,排名相同的商品可以按照 product_id 升序排序。

初始版本

  • 这个题目一开始只能写成下面那个初始化的版本,并不知道怎么在同一类别中再进行排名。
SELECT products.name as product_name, sum(quantity) as total_sales , products.category as category_rank
FROM ordersjoin products on products.product_id = orders.product_id 
group by products.name , products.category ,orders.product_id;

最终版本

SELECTproducts.name as product_name,SUM(orders.quantity) AS total_sales,RANK() OVER (PARTITION BYproducts.categoryORDER BYSUM(orders.quantity) DESC,products.product_id ASC) AS category_rank
FROMproductsJOIN orders ON products.product_id = orders.product_id
GROUP BYproducts.name,products.category,products.product_id
ORDER BYproducts.category ASC,total_sales DESC,products.product_id ASC;

复习的知识

  • Rank关键字
    • 用来给结果集中的每一行分配一个排名,通过over来确定排名如何运用。
    • 需要使用order by来指定排名顺序
      在这里插入图片描述
  • 通过partion by将数据进行分组,然后按组内的数据进行排名。上述要求中,是按照同类别的销售总量进行的排序,所以需要增加一个partion by关键字
rank() over (partition by products.category order by sum(quantity) DESC , products.product_id ASC) as category_rank
第四题

在这里插入图片描述

个人实现

  • 无限次加一和减一操作,总量sum是不变的,直接计算一下平均值,看看能不能范围内,借此判定是否可以操作。然后计算所有小于左边界差值的累加和以及所有大于右边界的差值的累加和,然后选一个最大值就行了!
  • 这个代码写的很快,但是剩下的样例不知道怎么过了,感觉没啥问题!
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int T = in.nextInt();while (T-- > 0) { // 注意 while 处理多个 caseint n = in.nextInt();int l = in.nextInt();int r = in.nextInt();int[] nums = new int[n];long sum = 0L;for(int i = 0;i < n;i ++)   {nums[i] = in.nextInt();sum += nums[i];}long avg = (long)sum / n;if(avg > r || avg < l)  System.out.println(-1);else{long subCount = 0;long addCount = 0;for(int x:nums){if(x < l)   addCount += (l - x);if(x > r)   subCount += (x - r);}System.out.println(Math.max(addCount , subCount));} // 现在进一步进行判定}}
}
  • 忽然间想到,我是使用long保存的平均值,会报错,具体如下
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别int T = in.nextInt();while (T-- > 0) { // 注意 while 处理多个 caseint n = in.nextInt();int l = in.nextInt();int r = in.nextInt();int[] nums = new int[n];long sum = 0L;for(int i = 0;i < n;i ++)   {nums[i] = in.nextInt();sum += nums[i];}double avg = sum / (double)n;if(avg > r || avg < l)  System.out.println(-1);else{long subCount = 0;long addCount = 0;for(int x:nums){if(x < l)   addCount += (l - x);if(x > r)   subCount += (x - r);}System.out.println(Math.max(addCount , subCount));} // 现在进一步进行判定}}
}

在这里插入图片描述

第五题

在这里插入图片描述
个人实现

  • 这个先简单点,直接用滑动窗口去做,然后统计一下每一次滑动窗口是否符合条件!但是问题在于,如何写出一个统计函数,计算每一个子串是不是好串!怎么写?需要记录一下状态,也就是每一个序列中,到当前序列而言,对应的零和一的数量,然后在进行计算!
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNext()) { // 注意 while 处理多个 caseString str = in.next();char chars[] = str.toCharArray();// 使用滑动窗口进行遍历int count0 = 0;int count1 = 0;int res = 0;int n = chars.length;for (int l = 0, r = 0; r < n; r++) {if (chars[r] == '0') count0 ++;if (chars[r] == '1') count1 ++;// 移动l,保证l到r是一个好子串while (l <= r && count0 < count1) {if (chars[l] == '0') count0 --;else count1 --;l ++;}if (count0 > count1)res ++;}System.out.println(res);}}
}

总结

  • 写的快,但是通过的样例也少了,如果按照正常的考试时间安排,能够通过三个题,差不多可以进面。第四题,应该还有其他的方法,这里直接看解析!

再次尝试,使用状态记录

  • 效果属实一般,全部超时!
import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNext()) { // 注意 while 处理多个 caseString str = in.next();char chars[] = str.toCharArray();// 使用滑动窗口进行遍历int count0 = 0;int count1 = 0;int res = 0;int n = chars.length;int[][][] dp = newint[n][n][3];  // 第一个数字表示1合法序列,0未非法序列,后续两个分别是0和1的数量for (int l = 0; l < n; l++) {for (int r = l ; r < n; r ++) {if (l == r) {if (chars[l] == '0') {dp[l][r][0] = 1;dp[l][r][1] = 1;dp[l][r][2] = 0;res ++;} else {dp[l][r][0] = 0;dp[l][r][1] = 0;dp[l][r][2] = 1;}}// 两者不相等,直接进行判断else {// 更新一下0和1的数量if (chars[r] == '0') {dp[l][r][1] = dp[l][r - 1][1] + 1;} else {dp[l][r][2] = dp[l][r - 1][2] + 1;}if (dp[l][r - 1][0] == 0) {// 上一个状态的子串是非法的dp[l][r][0] = 0;} else {if (dp[l][r][1] > dp[l][r][2]) {// 0的数量大于1,那么直接更新dp[l][r][0] = 1;res ++;} else {dp[l][r][0] = 0;}}}}}System.out.println(res);}}
}
参考实现
  import java.util.*; class Main { static final int MAXN = (int) (1e5 + 10); static char[] chs = new char[MAXN]; static long res = 0; public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String s = scanner.next(); int n = s.length(); for(int i = 1; i <= n; i++) { chs[i] = s.charAt(i - 1); } int cnt1 = 0, cnt0 = 0; for(int l = 1, r = 1; r <= n; r++) { if(chs[r] == '0') cnt0++; else cnt1++; while(cnt1 >= cnt0 && l <= r) { if(chs[l] == '0') cnt0--; else cnt1--; l++; } res += (r - l + 1); res -= 2L * cnt1; } System.out.println(res); } }

总结

  • 基本思路都是滑动窗口的,但是最后那里去除不合法子串那里,有点问题,感觉有点疑惑,然后计算所有合法子串那里确实世界计算r-l +1 的结果,因为开头变了,子串的状态就变了!

总结

  • 提前练了一下携程的笔试,感觉还行,基本上能过个三四题!继续加油!冲!

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

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

相关文章

【读书笔记-《30天自制操作系统》-22】Day23

本篇内容比较简单&#xff0c;集中于显示问题。首先编写了应用程序使用的api_malloc&#xff0c;然后实现了在窗口中画点与画线的API与应用程序。有了窗口显示&#xff0c;还要实现关闭窗口的功能&#xff0c;于是在键盘输入API的基础上实现了按下按键关闭窗口。最后发现用上文…

模版进阶(template)

1.非类型模版参数 模版参数分类类型形参与非类型形参。 ① 类型形参&#xff1a;出现在在模板参数列表中&#xff0c;跟在class或者typename之类的参数类型名称。 ② 非类型形参&#xff0c;就是用一个常量作为类(函数)模板的一个参数&#xff0c;在类(函数)模板中可将该参数当…

有毒有害气体检测仪的应用和性能_鼎跃安全

随着现代工业的不断发展和扩张&#xff0c;越来越多的企业涉及到有毒有害气体的生产、使用和处理。工业规模的扩大导致有毒有害气体的排放量增加&#xff0c;同时也增加了气体泄漏的风险。在发生火灾、爆炸或危险化学品泄漏等紧急事件时&#xff0c;救援人员需要迅速了解现场的…

Activiti7《第二式:破剑式》——工作流中的以柔克刚

冲冲冲&#xff01;开干 这篇文章将分为九个篇章&#xff0c;带你逐步掌握工作流的核心知识。这篇文章将带你深入探讨工作流中的 “破剑式”&#xff0c;揭示如何通过 柔与刚 的结合来破解工作流的复杂性。本篇包含了 Activiti7 环境的进一步优化和表结构的深入分析&#xff0…

Python学习——【2.1】if语句相关语法

文章目录 【2.1】if语句相关一、布尔类型和比较运算符&#xff08;一&#xff09;布尔类型&#xff08;二&#xff09;比较运算符 二、if语句的基本格式※、练习 三、if-else组合判断语句※、练习 四、if-elif-else多条件判断语句※、练习 五、判断语句的嵌套※、实战案例 【2.…

【速成Redis】02 Redis 五大基本数据类型常用命令

前言&#xff1a; 上一节课&#xff0c;我们对redis进行了初步了解&#xff0c;和安装好了redis。【速成Redis】01 Redis简介及windows上如何安装redishttps://blog.csdn.net/weixin_71246590/article/details/142319358?spm1001.2014.3001.5501 该篇博客&#xff0c;我们正…

HTML入门笔记

概述 HTML&#xff08;超文本标记语言—HyperText Markup Language&#xff09;是构成 Web 世界的基础&#xff0c;是一种用来告知浏览器如何组织页面的标记语言。 超文本 Hypertext&#xff1a;指连接单个或多个网站间的网页链接&#xff0c;通过这些链接可以访问互联网中的…

论文速递!时序预测!DCSDNet:双卷积季节性分解网络,应用于天然气消费预测过程

本期推文将介绍一种新的时序预测方法:双卷积季节性分解网络&#xff08;Dual Convolution withSeasonal Decomposition Network, DCSDNet&#xff09;在天然气消费预测的应用&#xff0c;这项研究发表于《Applied Energy》期刊。 针对天然气消费的多重季节性和非规律性&#x…

【速成Redis】01 Redis简介及windows上如何安装redis

前言&#xff1a; 适用于&#xff1a;需要快速掌握redis技能的人&#xff08;比如我&#xff09;&#xff0c;在b站&#xff0c;找了个课看。 01.课程简介_哔哩哔哩_bilibili01.课程简介是【GeekHour】一小时Redis教程的第1集视频&#xff0c;该合集共计19集&#xff0c;视频…

【面试八股总结】GMP模型

GMP概念 G&#xff08;Goroutine&#xff09;&#xff1a;代表Go协程&#xff0c;是参与调度与执行的最小单位。 存储Goroutine执行栈信息、状态、以及任务函数等。G的数量无限制&#xff0c;理论上只受内存的影响。Goroutines 是并发执行的基本单位&#xff0c;相比于传统的线…

Redis集群知识及实战

1. 为什么使用集群 在哨兵模式中&#xff0c;仍然只有一个Master节点。当并发写请求较大时&#xff0c;哨兵模式并不能缓解写压力。我们知道只有主节点才具有写能力&#xff0c;那如果在一个集群中&#xff0c;能够配置多个主节点&#xff0c;是不是就可以缓解写压力了呢&…

sourcetree配置ssh连接gitee

使用PuttyGen.exe生成的公钥私钥格式和git文档方法生成的不一样&#xff0c; SSH 公钥设置 | Gitee 帮助中心 gitee方法生成的公钥类似&#xff1a; ssh-ed25519 AAAA***5B Gitee SSH Key PuttyGen.exe生成的&#xff1a; 公钥 ---- BEGIN SSH2 PUBLIC KEY ---- Comment:…

【新手/小白教程】打开一个vue项目的前置准备,nvm安装指定版本node

目录 一、前言二、nvmnvm介绍nvm下载与安装1. 官网下载 nvm 包2. 安装 nvm-setup.exe3. 配置路径和下载镜像4. 检查nvm是否安装完成5. 错误情况 三、nodenode版本查看node命令 一、前言 在换新电脑的时候总是需要把所有东西重新安装配置&#xff0c;这篇用来记录一下打开一个v…

【云原生监控】Prometheus之PushGateway

Prometheus之PushGateway 文章目录 Prometheus之PushGateway介绍作用资源列表基础环境一、部署PushGateway1.1、下载软件包1.2、解压软件包1.3、编辑配置systemctl启动文件1.4、创建日志目录1.5、加载并启动1.6、监控端口1.7、访问PushGateway 二、 配置Prometheus抓取PushGate…

IP协议及相关特性

IP协议负责地址管理和路由选择。它的组成为&#xff1a; 接下来我们将对其中较重要的部分进行介绍。 4位版本&#xff1a;这里的四位版本只有两个取值 分别为IPv4和IPv6&#xff0c;这两个额分别为不同的IP协议&#xff0c;但是现在主流的还是IPv4但是近年来IPv6在中国的普及率…

OpenHarmony(鸿蒙南向开发)——标准系统方案之瑞芯微RK3566移植案例(上)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ OpenHarmony&#xff08;鸿蒙南向开发&#xff09;——轻量系统STM32F407芯片移植案…

Java语言程序设计基础篇_编程练习题*18.28 (非递归目录大小)

目录 题目&#xff1a;*18.28 (非递归目录大小) 习题思路 代码示例 输出结果 题目&#xff1a;*18.28 (非递归目录大小) 不使用递归改写程序清单18-7 习题思路 &#xff08; getSize方法&#xff09; 创建一个变量表示总共的大小。传入路径&#xff0c;创建File文件。创建A…

【Elasticsearch】-图片向量化存储

需要结合深度学习模型 1、pom依赖 注意结尾的webp-imageio 包&#xff0c;用于解决ImageIO.read读取部分图片返回为null的问题 <dependency><groupId>org.openpnp</groupId><artifactId>opencv</artifactId><version>4.7.0-0</versio…

docker存储

docker分层结构 如图所示&#xff0c;容器是由最上面可读可写的容器层&#xff0c;以及若干个只读镜像层组成&#xff0c;创建容器时&#xff0c;容器中的 数据都来自镜像层。这样的分层机构最大的特点是写时复制&#xff1a; 1、容器中新生成的数据会直接存放在容器层&#xf…

移动技术开发:登录注册界面

1 实验名称 登录注册界面 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?><LinearLayoutxmlns:android"http://schemas.android.com/apk/…