浙江保融科技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;可对动植物复杂农艺性…

网络性能测试工具 iperf

简介 Iperf 是一个网络性能测试工具&#xff0c;可以测试最大TCP和UDP带宽性能&#xff0c;具有多种参数和UDP特性&#xff0c;可以根据需要调整&#xff0c;可以报告带宽、延迟抖动和数据包丢失。 官网地址&#xff1a;iPerf - Download iPerf3 and original iPerf pre-comp…

shell 脚本批量导入、导出docker images

目录&#xff1a; 需要将运行中的docker 容器批量出&#xff0c;并在新的主机上批量导入。 创建批量导出脚本 export_docker_images.sh #!/bin/bash# 检查 Docker 是否在运行 if ! docker info > /dev/null 2>&1; thenecho "Docker 似乎没有运行。请确保 Dock…

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手工命令备份与自动备份

1、手工备份数据库数据 进入命令目录&#xff1a;cd /usr/local/mysql/bin&#xff0c;确保该目录下有mysqldump 然后在命令行 输入 mysqldump -u root -p dbname > dbname_backup_20240612.sql 注意&#xff0c;这里的dbname 是指你想要备份的数据库的名字。 通过这个命…

go-zero 安装

1.安装goctl 工具 go install github.com/zeromicro/go-zero/tools/goctllatest 2.安装protoc goctl env check --install --verbose --force 3.创建项目总目录 gozero_stusy &#xff08;此目录为总目录&#xff0c;下面有多个服务&#xff0c;每个服务一个目录 比如 use…

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

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

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

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

配置yum本地源脚本

在应对无网络或者其它特殊情况下&#xff0c;使用本地yum源 ①查看Linux系统版本&#xff0c;不同的版本yum仓库的挂载路径有所不同 > 以repodata所在目录为准 ②将光盘挂载到手动挂载点/mnt下面 ③将原有yum源仓库进行迁移备份 ④配置本地yum源仓库信息并初始化 #!/us…

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

一、来自不同行业、不同所有制的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…

滑动窗口(单调栈)

239. 滑动窗口最大值 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,-1…

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…

移动平均法

移动平均法是一种基于时间序列数据来预测未来值或分析数据趋势的常用方法。它主要用于预测未来一期或几期内公司产品的需求量、公司产能等。以下是对移动平均法的详细解释&#xff1a; 基本原理 移动平均法的基本原理是通过消除时间序列资料中的不规则和其他变动&#xff0c;…