19-20真题
19-20真题自操作表,指表中元素被find函数访问到,就自动移动到表头,并保持其他元素顺序不变 用数组存储结构写find功能 写链表存储结构的find功能 1234567891011121314151617181920212223242526272829303132void Find(char a[],int n,char e){ //n为数组长度,e为要查找的元素 for(int i=0;i<n;i++){ if(a[i]==e){ //找到元素之后 for(int j=i-1;j>=0;j--){ a[j+1]=a[j];//i-1位置之前的所有结点后移 } a[0]=e; } }}struct LNode{ char data;//数据域,保存结点的值 struct LNode *next;//指...
20年833
20年8331. 给一个带头结点单链表,删除所有值为k的节点1234567891011121314151617181920struct ListNode{ int val; struct ListNode *next;};ListNode * removeElements(ListNode *head,int k){ if(head==NULL) return NULL; ListNode *p=head; ListNode *q; while(p->next!=NULL)//用p来遍历链表 { if(p->next->val==k){//p的后一个节点为要删除的结点 q=p->next; p->next=p->next->next; free(q);//删除值为k的结点,并释放内存 } else p=p-&g...
22真题
22真题5. (1)使用C语言给出双链表的数据结构(2)写出删除结点的C语言实现1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253struct node{ struct node *prev; int data; struct node *next;}void deletion_beginning(node *head){ struct node *ptr; if(head==NULL) { printf("UNDERFLOW\n"); }else if(head->next==NULL){ head=NULL; free(head); printf("not delete"); } else{ ...
测试卷1-0
title: 测试卷1.0tags: algorithm datastruct 真题cover: img/realquestion.jpegabbrlink: 4ccb95c4date: 2022-09-11 22:10:14— 测试卷1.01. 旧事重提二分法实现幂函数x的n次方pow(x,n) 这里的二分法是指减少乘法的次数,把重复的运算省去。我要求x的n次方,那么先求x的n/2次方,然后两个相乘起来。如此递归下去。 1234567891011121314151617181920212223242526272829303132int pow(int x,int n){ int t=1; while(n){ if(n%2==1){ n=n-1; t*=x; } x*=x; n/=2; } return t;}double fun(double x,int n){ if(n==...
Spring 核心 IOC 深度解析:从原理到实战
一、IOC 核心概念:从「手动控制」到「容器托管」1.1 什么是 IOC?IOC(Inversion of Control)控制反转 是 Spring 框架的灵魂,核心是将对象的创建、依赖管理、生命周期控制从业务代码中剥离,交由 Spring 容器统一管理。 传统开发模式(无 IOC): 12345678// 手动创建对象,硬编码依赖public class UserService { private UserRepository userRepository = new UserRepositoryImpl(); public void getUser() { userRepository.findUser(); }} 缺点:耦合度极高,修改实现类需要改代码,无法做到开闭原则。 Spring IOC 模式: 12345678910// 只声明依赖,创建和注入交给容器@Servicepublic class UserService { @Autowired private Us...
深度剖析 HashMap:从底层原理到最佳实践
HashMap 作为 Java 集合框架中最常用的键值对存储实现,几乎是所有 Java 开发者日常开发的 “标配”。但你真的了解它的底层逻辑吗?为什么 JDK 1.8 要引入红黑树?扩容时的高低位分离有什么优势?本文将从数据结构、核心算法、关键方法到性能优化,全方位拆解 HashMap 的设计精髓。 一、底层数据结构:从 “数组 + 链表” 到 “数组 + 链表 + 红黑树”HashMap 的性能核心依赖于底层数据结构的设计,JDK 1.7 到 1.8 的演进是其性能跃升的关键。 1.1 JDK 1.7 vs 1.8 核心差异 特性 JDK 1.7 JDK 1.8 底层结构 数组 + 链表 数组 + 链表 + 红黑树 链表插入方式 头插法(易死循环) 尾插法(避免死循环) 扩容链表处理 重新计算 Hash,顺序混乱 高低位分离,保持原有顺序 性能优化 无 链表转红黑树(阈值 8) 1.2 核心结构定义HashMap 的底层由哈希桶数组、链表节点、红黑树节点三部分组成(JDK 1.8): 1234567891011121314151617181920212...
深度解析 ArrayList 扩容机制:从源码到时序图全拆解
在 Java 开发中,ArrayList 是最常用的集合类之一,但其底层的扩容机制却常常成为面试和开发中的高频考点。本文将从底层数据结构出发,结合源码和时序图,完整拆解 ArrayList 的扩容流程,帮你彻底搞懂这一核心机制。 一、ArrayList 底层数据结构ArrayList 的核心是动态数组,所有操作最终都围绕数组的扩容和元素复制展开。先看核心源码结构: 12345678910111213141516public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable { // 真正存储元素的数组(transient表示不参与序列化) transient Object[] elementData; // 数组中实际元素的个数(≠数组长度) private int size; // 默认初始容量 ...
RabbitMQ实战全解析:从核心概念到电商订单落地
在微服务与分布式系统架构中,消息队列是解决系统解耦、削峰填谷、异步通信的核心组件,而RabbitMQ作为AMQP(高级消息队列协议)的成熟实现,凭借其稳定的路由能力、完善的确认机制、灵活的持久化策略以及丰富的插件扩展,成为企业级开发中的首选方案。 很多开发者在使用RabbitMQ时,常会陷入“会用但用不精”的困境——比如不清楚Exchange的四种类型该如何选择、生产者确认机制怎么配置、重试与幂等该如何设计,导致线上出现消息丢失、重复消费、系统阻塞等问题。 本篇博客将彻底解决这些痛点,不绕弯、不堆砌理论,从核心概念入手,搭配可直接复制运行的Java原生与Spring Boot代码,最后结合电商下单场景,完整演示RabbitMQ在企业级项目中的端到端设计,帮你真正把RabbitMQ用好、用稳。 一、核心概念速览在使用RabbitMQ之前,必须先理清其核心组件的作用,这些概念是后续实战的基础,无需死记硬背,结合实际场景理解即可。 Broker(消息中间件节点):简单来说,就是运行RabbitMQ服务的进程,相当于一个“消息中转站”。它负责管理Exchange(交换器)、Queue(...
RabbitMQ可靠性保障全指南 生产者,MQ,消费者三层兜底
在微服务分布式架构中,RabbitMQ作为主流消息队列,核心价值是解耦、削峰填谷和异步通信,但“消息丢失、重复消费、处理失败”等问题,往往成为线上故障的重灾区。很多开发者只掌握RabbitMQ的基础用法,却忽略了可靠性保障的核心逻辑,导致系统上线后频繁出现异常。 其实RabbitMQ的可靠性并非单点保障,而是需要贯穿「生产者→MQ自身→消费者」全链路,三层协同发力才能真正实现“消息发得出、存得住、处理完”。本篇博客将从这三个核心维度,拆解可靠性保障的原理、工作流程、关键配置和可直接复制运行的Spring Boot代码,覆盖生产环境高频场景,帮你彻底解决消息可靠性难题。 一、生产者可靠性:确保消息“发得出、送得到”生产者是消息链路的起点,可靠性核心解决两个核心问题:一是网络波动、MQ宕机时的连接稳定性(自动重连),二是确认消息确实被MQ接收(生产者确认),二者缺一不可,否则会导致消息“石沉大海”。 1. 生产者自动重连机制原理:RabbitMQ客户端(Java AMQP客户端/Spring AMQP)与MQ服务端建立TCP连接后,若因网络中断、MQ宕机、连接超时等异常导致连接断开,...
RabbitMQ的延迟消息在项目中的运用及实现剖析
对于后端开发者而言,RabbitMQ 的延迟消息不仅是项目中的高频应用,更是面试时的“必考题”——尤其是当面试官抛出这个经典场景时,很多人容易陷入“知其然不知其所以然”的困境: 用户下单后未支付,如何在指定时间(如30分钟)自动取消订单? 相信很多同学都能说出“用 MQ”“用死信队列”,但当被追问“原理是什么”“为什么这么设计”“生产环境怎么落地”时,往往语塞。 今天这篇文章,我将以「面试官视角」拆解考点,结合「真实项目落地场景」,把延迟消息的核心逻辑、两种实现方案,以及订单超时取消的完整代码,一次性讲透、讲明白。 订单超时未支付,如何自动取消? 很多同学: 知道用 MQ 知道死信队列 但一问原理就说不清 本文将以 “面试官视角” + “真实项目设计” 的方式,系统讲清: RabbitMQ 为什么不直接支持延迟队列 延迟消息的 两种主流实现方案 订单超时取消的 完整设计 + Java 代码 一、面试引入:订单超时关闭你是怎么做的?这是一个非常经典的后端面试题,本质考察三点: 你有没有真实做过业务 你对 MQ 的理解是不是停留在 API 层 你是否具备系统设计能力 业务...

