浙江保融科技2025实习生校招校招笔试分享

笔试算法题一共是有4道,第一道是手搓模拟实现一个ArrayList,第二道是判断字符串是否回文,第三道是用代码实现1到2种设计模式。

目录

一.模拟实现ArrayList

二.判断字符串是否回文

▐ 解法一

▐ 解法二

▐ 解法三

三.代码实现设计模式


一.模拟实现ArrayList

首先,要实现一个ArrayList就必须得知道ArrayList有哪些方法,他相较于别的数据结构有什么特性。

顺序表是一种线性数据结构,是数据元素按照线性顺序存储的数据结构,通常使用数组实现。顺序表中的元素以一定的顺序排列,每个元素都可以通过下标来进行访问。顺序表支持随机访问,可以快速地访问任意一个元素,但插入或删除元素时需要移动其余元素,效率较低。

这是ArrayList的API文档:ArrayList - Java17中文文档

我们可以基于数组实现ArrayList

    public int[] arr;//使用数组来实现ArrayListpublic int usedSize;//public static final int DEFAULT_SIZE = 10;

有了基础的数据结构以后,我们就可以通过其中的 usedSize 和 arr 灵活的去操作顺序表。

对于ArrayList我们至少要实现以下的一些功能

public interface Ilist {// 新增元素,默认在数组最后新增public void add(int data);// 在 pos 位置新增元素public void add(int pos, int data);// 判定是否包含某个元素public boolean contains(int toFind);// 查找某个元素对应的位置public int indexOf(int toFind);// 获取 pos 位置的元素public int get(int pos);// 给 pos 位置的元素设为 valuepublic void set(int pos, int value);//删除第一次出现的关键字keypublic void remove(int toRemove);// 获取顺序表长度public int size();// 清空顺序表public void clear();
}

对应上述的接口,可以按照如下实现 

import java.util.Arrays;public class MyArrayList implements Ilist {public int[] arr;public int usedSize;public static final int DEFAULT_SIZE = 5;public MyArrayList() {arr = new int[DEFAULT_SIZE];}public void display() {for (int x : arr) {System.out.print(x + " ");}System.out.println();}// 新增元素,默认在数组最后新增public void add(int data) {//判断满了之后要扩容if (arr.length == usedSize) {arr = Arrays.copyOf(arr, DEFAULT_SIZE * 2);}arr[usedSize] = data;usedSize++;}// 在 pos 位置新增元素public void add(int pos, int data) {cheakPos(pos);//判断满了之后要扩容if (arr.length == usedSize) {arr = Arrays.copyOf(arr, DEFAULT_SIZE * 2);}//移动元素留出空位for (int i = usedSize - 1; i >= pos; i--) {arr[i + 1] = arr[i];}arr[pos] = arr[pos - 1];//给pos位置元素赋值arr[pos - 1] = data;usedSize++;}// 判定是否包含某个元素public boolean contains(int toFind) {for (int i = 0; i < usedSize; i++) {if (arr[i] == toFind)return true;}return false;}// 查找某个元素对应的位置public int indexOf(int toFind) {for (int i = 0; i < usedSize; i++) {if (arr[i] == toFind)return i + 1;}return -1;}// 获取 pos 位置的元素public int get(int pos) {//检查输入位置是否合法cheakPos(pos);//检查顺序表是否为空cheakEmpty();return arr[pos];}// 给 pos 位置的元素设为 valuepublic void set(int pos, int value) {//检查输入位置是否合法cheakPos(pos);//检查顺序表是否为空cheakEmpty();arr[pos-1] = value;}//删除第一次出现的关键字keypublic void remove(int toRemove) {//检查顺序表是否为空cheakEmpty();int delPos = indexOf(toRemove);for (int i = delPos; i < usedSize; i++) {arr[i-1] = arr[i];}arr[usedSize-1] = arr[usedSize];usedSize--;}// 获取顺序表长度public int size() {//检查顺序表是否为空cheakEmpty();return usedSize;}// 清空顺序表public void clear() {usedSize = 0;}private void cheakPos(int pos) {if (pos < 0 || pos > usedSize)throw new ExceptionOfPos("pos位置不能为:" + pos);}private void cheakEmpty() {if (usedSize == 0)throw new ExceptionOfEmpty("当前顺序表为空,无法操作");}
}

最后俩个自定义异常用来处理 pos 位置非法和顺序表为空。 


二.判断字符串是否回文

这道题目在leetcode上也是有资源的,这里将链接给出:LCR 018. 验证回文串 - 力扣(LeetCode)

给定一个字符串 s ,验证 s 是否是 回文串 ,只考虑字母和数字字符,可以忽略字母的大小写。本题中,将空字符串定义为有效的 回文串 

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: s = "race a car"
输出: false
解释:"raceacar" 不是回文串

▐ 解法一

可以采用双指针法,设置俩个指针分别指向字符串的首个和末尾元素,然后利用他们挨个遍历比较。

首先将原有的字符串去除大写,通过 toLowerCase 将原字符串全部转化为小写,并且通过 replaceAll 利用正则表达式将所有的非字母非数字的元素全部删除掉,然后就得到了一个不包含其他字符的字符串。

在得到这么一个字符串后,为了方便我们遍历其中的每个元素,我们可以将这个字符串转化为字符数组,然后定义一个左右双指针来遍历整个数组,如果在其中某一个步骤首尾元素不相同,我们就直接返回 false 。正常情况则继续遍历下一轮,最后得出结论。

class Solution {public boolean isPalindrome(String s) {s= s.toLowerCase().replaceAll("[^a-z0-9]", "");char[] charArray = s.toCharArray();int first = 0;int last = charArray.length - 1;while (first <= last) {if (charArray[first] != charArray[last]) {return false;}first++;last--;}return true;}
}

▐ 解法二

我们可以采取直接对比原字符串和该字符串的镜像字符串,如果他们相同,则说明他们是回文串。

要实现这样的对比,首先第一步要做的还是对字符串的过滤,需要将其中的特殊字符和大小写过滤掉,为了方便操作,我们使用 StringBuffer 来进行字符串的拼接操作,我们对字符串的每一个字符都进行判断,只有该字符是字母和数字的时候才将其放入 StringBuffer 进行拼接。

最后对于得到的完整字符串,我们再调用 reverse 方法对齐进行镜像的反转,然后将俩个字符串对比得出结论。

class Solution {public boolean isPalindrome(String s) {// 创建一个StringBuffer对象来存储处理后的字符StringBuffer buffer = new StringBuffer();// 遍历输入字符串for (int i = 0; i < s.length(); i++) {char c = s.charAt(i);// 仅当字符是字母或数字时才将其加入 bufferif (Character.isLetterOrDigit(c)) {buffer.append(Character.toLowerCase(c));}}// 创建一个新的StringBuffer对象,它是buffer的反转StringBuffer rebuffer = new StringBuffer(buffer).reverse();// 检查rebuffer和buffer是否相等return buffer.toString().equals(rebuffer.toString());}
}

▐ 解法三

同样是使用双指针法,但不同的是我们这一次直接对原字符串进行操作,这样就可以避免浪费额外的空间去存储中间步骤。

对于双指针的基本概念这里就不再赘述,在判断的时候需要对于每一步的字符进行额外的判断,每一个步骤都要保证左指针小于右指针,并且俩个指针指向的元素必须是字母和数字。

在对俩个字符比较的时候需要调用 toLowerCase 屏蔽大小写差异。

class Solution {public boolean isPalindrome(String s) {int left = 0;int right = s.length() - 1;while (left < right) {//保证左指针的指向始终为需要判断的字母和数字while (left < right && !Character.isLetterOrDigit(s.charAt(left))) {left++;}//保证右指针的指向始终为需要判断的字母和数字while (left < right && !Character.isLetterOrDigit(s.charAt(right))) {right--;}if (left < right) {//如果左指针和右指针指向的字母不同,则直接返回falseif (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {return false;}//左右指针指向的元素相同,则进行下一次判断left++;right--;}}return true;}
}

三.代码实现设计模式

单例模式:确保一个类只有一个实例,并提供一个全局访问点。

public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

工厂模式:定义一个创建对象的接口,但让子类决定实例化哪一个类。工厂方法让类的实例化推迟到子类。

public interface Product {void use();
}public class ConcreteProductA implements Product {public void use() {System.out.println("Using Product A");}
}public class ConcreteProductB implements Product {public void use() {System.out.println("Using Product B");}
}public abstract class Factory {public abstract Product createProduct();
}public class ConcreteFactoryA extends Factory {public Product createProduct() {return new ConcreteProductA();}
}public class ConcreteFactoryB extends Factory {public Product createProduct() {return new ConcreteProductB();}
}

观察者模式:定义对象间的一对多依赖,当一个对象改变状态时,所有依赖的对象都会收到通知并自动更新。

import java.util.ArrayList;
import java.util.List;public interface Observer {void update(String message);
}public class ConcreteObserver implements Observer {private String name;public ConcreteObserver(String name) {this.name = name;}public void update(String message) {System.out.println(name + " received: " + message);}
}public interface Subject {void attach(Observer observer);void detach(Observer observer);void notifyObservers();
}public class ConcreteSubject implements Subject {private List<Observer> observers = new ArrayList<>();private String message;public void attach(Observer observer) {observers.add(observer);}public void detach(Observer observer) {observers.remove(observer);}public void notifyObservers() {for (Observer observer : observers) {observer.update(message);}}public void setMessage(String message) {this.message = message;notifyObservers();}
}



 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

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

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

相关文章

网络协议安全:TCP/IP协议栈的安全问题和解决方案

「作者简介」:北京冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础对安全知识体系进行总结与归纳,著作适用于快速入门的 《网络安全自学教程》,内容涵盖Web安全、系统安全等12个知识域的一百多个知识点,持续更新。 这一章节我们需要知道TCP/IP每…

大模型扫盲系列——大模型实用技术介绍_大模型底层技术是哪些

Gemma模型架构和参数计算 近期&#xff0c;大模型相关的技术和应用层出不穷&#xff0c;各个方向的论文百花齐放&#xff0c;底层的核心技术是大家公认的精华部分。本文从技术的角度聚焦大模型的实战经验&#xff0c;总结大模型从业者关注的具体方向以及相关发展&#xff0c;帮…

干货 | 如何进行群体DNA甲基化分析

目前&#xff0c;针对群体的研究基本上还是以重测序为主&#xff0c;基于对遗传多样性丰富的自然群体中的个体进行全基因组重测序&#xff0c;研究物种遗传进化多样性&#xff0c;结合准确的目标性状的表型数据及统计方法进行全基因组关联分析&#xff0c;可对动植物复杂农艺性…

MEME使用-motif分析(生物信息学工具-24)

01 背景 Motif分析是一种在生物信息学和计算生物学中广泛应用的技术&#xff0c;用于识别DNA、RNA或蛋白质序列中具有生物学功能的短保守序列模式&#xff08;motif&#xff09;。这些motif通常与特定的生物学功能相关&#xff0c;如DNA中的转录因子结合位点、RNA中的剪接位点…

最新Springboot小程序医院核酸检测服务系统

采用技术 最新Springboot小程序医院核酸检测服务系统的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBootMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 页面展示效果 管理员页面 医护人员管理 普通管理员管理 接种进…

稳定安全生产设备日志采集工具

免费试用下载: Gitee下载 最新版本 优势: A. 开箱即用. 解压直接运行.不需额外安装. B. 批管理设备. 设备配置均在后台管理. C. 无人值守 客户端自启动,自更新. D. 稳定安全. 架构简单,内存占用小,通过授权访问.

vector oj题 和 位运算

知识点1&#xff1a; lowbit(x) 简介&#xff1a;众所周知&#xff0c;lowbit()操作是算法竞赛中的高级技巧&#xff0c;特别是高级数据结构&#xff0c;线段树的核心&#xff0c;还有什么二进制与位运算题目&#xff0c;而本文就用最通俗易懂的话&#xff0c;来教会大家lowbi…

【MySQL系列】MySQL 字符集的演变与选择

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

[信号与系统]有关滤波器的一些知识背景

前言 最近在看FIR和IIR&#xff0c;本文作为前置&#xff0c;需要在理解这两种滤波器之前阅读。 本文内容会详细讲述一下有关滤波器的技术要求。 选频滤波器的频率响应 选频滤波器&#xff08;Selective Frequency Filter&#xff09;的频率响应是描述该滤波器在不同频率下…

中国企业数字化转型现状、趋势和挑战

一、来自不同行业、不同所有制的145家企业的调查 为了了解中国企业数字化转型的现状、趋势和挑战&#xff0c;2022年我们完成了一次在线问卷调查。 受访企业达145家&#xff0c;国内企业111家&#xff0c;占比77%&#xff08;其中央企占总比例51%&#xff09;&#xff0c;民营…

【数据结构与算法(C语言)】离散事件模拟- 单链表和队列的混合实际应用

目录 1. 前言2. 流程图3. 数据结构3.1 单链表3.2 链式队列 4. 核心函数4.1 银行业务模拟 void BankSimulation()4.2 初始化 void OpenForDay()4.3 客户到达 void CustomerArrived(Event en)4.4 客户离开 void CustomerArrived(Event en) 5. 非核心函数5.1 新建客户 NewCustomer…

Redis精要

一、什么是缓存击穿、缓存穿透、缓存雪崩&#xff1f; 缓存穿透 【针对大量非法访问的请求&#xff0c;缓存中没有&#xff0c;直接访问DB】 缓存穿透指的查询缓存和数据库中都不存在的数据&#xff0c;这样每次请求直接打到数据库&#xff0c;就好像缓存不存在 一样。 对于系…

JVM-GC-常用调优命令和GC参数

定位问题常用命令 top&#xff1a;查看内存/CPU占用情况top -Hp pid: 查看进程内线程情况jsp:查看java进程情况jstack 线程pid:查看进程内线程信息&#xff0c;一般查看线程状态&#xff0c;判断是否死锁。重点观察&#xff1a;WAITING、BLOCKED的线程&#xff0c;另外查看wait…

全面的WAS存储权限管理方案,了解一下

WAS存储权限管理通常指的是对Windows Azure Storage&#xff08;WAS&#xff09;的存储设备进行权限控制和管理。在企业中&#xff0c;随着数据量的飞速增长&#xff0c;对存储设备的安全性、效率和成本的关注也日益增加。有效的WAS存储权限管理可以确保数据的安全性&#xff0…

UV胶带和UV胶水的应用场景有哪些不同吗?

UV胶带和UV胶水的应用场景有哪些不同吗? UV胶带和UV胶水的应用场景确实存在不同之处&#xff0c;以下是详细的比较和归纳&#xff1a; 一&#xff1a;按使用场景来看&#xff1a; UV胶带的应用场景&#xff1a; 包装行业&#xff1a;UV胶带在包装行业中常用于食品包装、药…

深圳比创达电子|EMC与EMI一站式解决方案:源头到终端的全面防护

随着电子技术的飞速发展&#xff0c;电磁兼容性&#xff08;EMC&#xff09;和电磁干扰&#xff08;EMI&#xff09;问题日益成为产品研发和生产的关键因素。为了帮助企业更好地应对这些挑战。 一、EMC与EMI的基本概述 电磁兼容性&#xff08;EMC&#xff09;是指设备或系统在…

【Linux】ss 命令使用详解

目录 一、ss命令介绍 二、ss命令格式和使用 1、命令格式 2、ss命令的常用选项 3、命令的常见用法 3.1 找出打开套接字/端口应用程序 3.2 检查系统的监听套接字 3.3 显示所有状态为established的SMTP连接 3.4 查看建立的 TCP 连接 3.5 通过 -r 选项解析 IP 和端口号 …

12通道温振信号采集卡

12 通道智能数据采集器&#xff0c;以下简称 SG-Vib-S12。 SG-Vib-S12 旨在帮助用户对工业生产中的设备健康状况进行监测与诊断&#xff0c; 降低因设备故障对生产过程产生的影响。SG-Vib-S12 输入同时兼容 IEP、ICP 两 线制、三线制&#xff08;振温一体&#xff09;传感器&…

【html】如何利用hbuilderX 开发一个自己的app并安装在手机上运行

引言&#xff1a; 相信大家都非常想开发一款自己的apk&#xff0c;手机应用程序&#xff0c;今天就教大家&#xff0c;如何用hbuilderX 开发一个自己的app并安装在手机上运行。 步骤讲解&#xff1a; 打开hbuilderX &#xff0c;选择新建项目 2.选择5app,想一个名字&#x…

js三元图的画法

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>三元图</title></head> <body>&l…