38 归档分页
370 留言互动
4 核心专题

NC119 最小的K个数

该题要求在长度 n 且可能含重复元素的数组中,找出不去重的最小 k 个数,返回任意顺序。约束为 0≤k,n≤10000,元素值在 0~1000 之间,空间 O(n),时间 O(n log n)。思路是先对数组使用 Arrays.sort 排序,再取前 k 个元素放入 ArrayList 返回。示例包括普通情况、k 为 0 以及含重复值的数组。

NC45 实现二叉树先序,中序和后序遍历

本文介绍了牛客网 NC45 题目——实现二叉树的先序、中序和后序遍历。要求在 O(n) 时间、O(n) 空间内完成,对空树返回空数组。解法使用三个 `ArrayList<Integer>` 分别存储三种遍历结果,递归实现 `firstOrder`、`middleOrder`、`laterOrder`,遍历结束后通过 `toIntArray` 将列表转为 `int[]` 并组装成 `int[3][]` 返回。代码简洁明了,重点在于确定存储结构、递归遍历逻辑以及列表转数组的实现。

NC140 排序

题目要求对长度不超过 1000、元素值在 0~10⁹ 范围的整数数组进行升序排序,基本实现需满足 O(n²) 时间、O(n) 空间,进阶要求 O(nlogn) 时间、O(n) 空间。示例展示了输入输出形式,鼓励实现多种排序算法。文中给出 Java 示例代码,直接对非空数组调用 `Arrays.sort` 完成排序并返回结果。

NC78 反转链表

本文介绍了单链表原地反转的实现。给定长度不超过1000的链表,要求在 O(n) 时间、O(1) 额外空间内完成反转,空链表直接返回空。核心思路是遍历链表,用三个指针依次记录当前节点、前驱节点和后继节点,在遍历过程中将当前节点的 next 指向前驱,实现逐步翻转。遍历结束后,前驱节点即为新表头。文中提供了完整的 Java 实现代码,代码结构简洁,易于理解。

NC1 大数加法

文章介绍了一个大数加法题目:输入两个仅含数字的字符串(长度≤100000),要求在 O(n) 时间内返回它们的和,结果仍为字符串。示例展示了普通加法和空串情况。提供的参考代码采用 Java 的 `BigInteger`,将字符串转换为 `BigInteger` 后直接相加,再转回字符串输出,满足题目要求。

StringUtils部分API的用法与区别

本文系统演示了 Apache Commons‑Lang3 中 `StringUtils` 常用判断 API 的使用差异。通过示例代码说明:`isEmpty` 只判断 null 与空串,不把空格算作空;`isAnyEmpty` 任意参数为 null/空串即返回 true;`isNoneEmpty` 与 `!isAnyEmpty` 等价,所有参数均非空才为 true;`isBlank` 同时把空格视为空值;`isAnyBlank`、`isNoneBlank` 分别检测是否存在或全部不存在空格或空值。文末列出 `StringUtils` 其它常用方法(trim、equals、startsWith、split、replace、pad 等)并提供官方文档链接,帮助读者快速选用合适的字符串工具。

10个词送给不甘平庸的你

作者小邹以“行动、努力、改变、学习、目标、勇气、归零、热爱、宽容、感恩”十个关键词,呼吁不甘平庸的读者及时行动、持续奋斗、主动适应、不断学习、设定并坚持小目标、保持勇气、放下过去、热衷所爱、宽容不完美、常怀感恩,以此在新一年实现自我突破。

过多赠予,无所适从

本文以 Spring @Autowired 为例,解析“required a single bean, but 2 were found”错误的根源——在容器中存在同类型的多个 Bean,且缺乏 @Primary、@Priority 或名称匹配等优先级标识,导致 Spring 无法决定注入对象。通过源码剖析展示了 Bean 的实例化与属性填充过程以及 AutowiredAnnotationBeanPostProcessor 的工作原理。解决思路包括为其中一个实现加 @Primary、使用 @Qualifier 或通过属性名与 Bean 名称精确匹配等方式,以明确注入目标,进而消除冲突。

原型 Bean 被固定

Spring 中把 @Service 标记为原型(@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE))的 Bean 注入到单例 @RestController 的字段时,Autowired 只在容器创建控制器时一次性实例化并固定该对象,导致原型作用失效并出现启动错误。源码分析显示 AutowiredAnnotationBeanPostProcessor 在 populateBean 阶段通过反射把找到的 Bean 直接赋值给字段,后续不再重新获取。解决办法有两种:①注入 ApplicationContext 并在方法中调用 applicationContext.getBean(ServiceImpl.class) 每次获取新实例;②在控制器中声明带 @Lookup 的抽象方法 getServiceImpl(),Spring 利用 CGLIB 生成子类并在调用时从 BeanFactory 动态获取原型 Bean。两种方式均能保证每次请求得到新的 ServiceImpl。文章还解释了 @Lookup 的实现原理以及 Spring 通过反射和方法覆盖实现原型注入的细节,提醒使用者注意单例‑原型混用的潜在陷阱。