当前位置: 首页 > article >正文

LeetCode 3280 将日期转换为二进制表示

【算法实战】日期转二进制:两种解法的思路与优化(附代码解析)

一、问题描述

给定一个yyyy-mm-dd格式的日期字符串,要求将年、月、日分别转为无前导零的二进制,并保持year-month-day格式。
示例:输入2025-03-15,输出11111101001-11-1111(2025→11111101001,3→11,15→1111)。

二、解法一:直接分割转换(新手友好)

思路分析

  1. 分割日期:按-拆分为年、月、日三部分。
  2. 转二进制:利用Integer.toBinaryString直接转换。
  3. 拼接结果:按格式拼接,无需处理前导零(Java 方法自动省略)。

代码实现

class Solution {public String convertDateToBinary(String date) {String[] parts = date.split("-"); // 分割日期return Integer.toBinaryString(Integer.parseInt(parts[0])) + "-" +Integer.toBinaryString(Integer.parseInt(parts[1])) + "-" +Integer.toBinaryString(Integer.parseInt(parts[2]));}
}

代码亮点

  • 简洁直观:一行代码完成核心逻辑,适合快速开发。
  • 自动去前导零:Java 的toBinaryString天然支持,无需额外处理。

复杂度分析

  • 时间:O (1)(日期长度固定,拆分和转换为常数操作)
  • 空间:O (1)(除输入外,额外空间固定)

三、解法二:逆向字符填充(性能优化)

思路升级

观察发现:日期各部分的二进制长度有限(年≤13 位,月≤4 位,日≤5 位),可预先分配固定大小的字符数组,从后向前填充,避免字符串拼接的性能损耗。

关键步骤拆解(以2025-03-15为例)

  1. 提取日(15):转为二进制1111,逆向填充到数组末尾。
  2. 插入-:在日的二进制前添加分隔符。
  3. 提取月(3):转为11,填充到-前。
  4. 插入-:在月的二进制前添加分隔符。
  5. 提取年(2025):转为11111101001,填充到最前面。

代码实现(含详细注释)

class Solution {private static final int MAX_LEN = 32; // 足够容纳最大可能的二进制(年13位 + 2个- + 月4位 + 日5位 = 25位)public String convertDateToBinary(String date) {char[] newDate = new char[MAX_LEN]; // 预分配固定大小数组int begin = MAX_LEN; // 从数组末尾开始填充// 处理日(索引8-9,即"dd")begin = appendBinary(date, newDate, begin, 8, 9);newDate[--begin] = '-'; // 插入日-月分隔符// 处理月(索引5-6,即"mm")begin = appendBinary(date, newDate, begin, 5, 6);newDate[--begin] = '-'; // 插入月-年分隔符// 处理年(索引0-3,即"yyyy")appendBinary(date, newDate, begin, 0, 3);// 从begin到数组末尾的有效字符转为字符串return new String(newDate, begin, MAX_LEN - begin);}private int appendBinary(String date, char[] arr, int ptr, int start, int end) {int num = 0;// 1. 提取日期部分并转为整数(如"2025"→2025)for (int i = start; i <= end; i++) {num = num * 10 + (date.charAt(i) - '0');}// 2. 整数转二进制,逆向填充字符数组while (num > 0) {arr[--ptr] = (char) ((num % 2) + '0'); // 取最低位,从后往前填num /= 2;}return ptr; // 返回新的填充起点}
}

核心优化点

  1. 避免字符串拼接:通过字符数组直接操作,减少String对象创建开销。
  2. 逆向填充:二进制低位在后(如 15→1111,填充顺序是1→1→1→1),天然符合数组从后往前填充的逻辑。
  3. 固定长度数组:预先计算最大可能长度(32 位足够),空间利用更高效。

四、两种解法对比

维度解法一(分割转换)解法二(逆向填充)
代码行数简洁(1 行核心逻辑)复杂(需处理索引和填充)
性能适用于大多数场景更优(减少字符串操作)
可读性直观,适合新手需理解逆向填充逻辑
适用场景快速开发、小规模数据高频调用、性能敏感场景

五、测试用例与输出

输入日期二进制表示说明
2025-03-1511111101001-11-1111正常日期,包含非整十数
2000-01-0111111010000-1-1月 / 日为个位数
1970-01-011111001110-1-1早期年份,二进制较短
9999-12-3110011100001111-1100-11111最大可能日期(年 9999)

六、总结

  • 核心考点:日期解析、二进制转换、字符串操作优化。
  • 逆向思维:通过预分配数组和逆向填充,避免字符串拼接的性能损耗,这是处理固定格式字符串的常用技巧。
  • 扩展性:若需处理大量日期(如日志批量转换),解法二更具优势;日常开发中解法一的简洁性更值得优先选择。

代码启示:编程中往往有多种解法,选择时需权衡可读性性能场景需求,这正是算法优化的魅力所在。

相关文章:

LeetCode 3280 将日期转换为二进制表示

【算法实战】日期转二进制&#xff1a;两种解法的思路与优化&#xff08;附代码解析&#xff09; 一、问题描述 给定一个yyyy-mm-dd格式的日期字符串&#xff0c;要求将年、月、日分别转为无前导零的二进制&#xff0c;并保持year-month-day格式。 示例&#xff1a;输入2025-…...

基于Java+MySQL实现的医药销售管理系统

医药销售管理系统 开发环境和开发工具 操作系统&#xff1a;win8.1 开发环境&#xff1a;Mysql、Web 开发工具&#xff1a;Workbench、Eclipse、JDBC 功能需求分析 员工有权查看、添加会员&#xff0c;查看、添加供应商&#xff0c;查询药品&#xff08;输入药品编号或名称…...

HTML 列表:构建清晰结构的网页内容

引言 在网页开发过程中&#xff0c;将信息有条理地呈现给用户至关重要。HTML 列表作为一种强大的工具&#xff0c;能够使内容更加结构化和易于阅读。HTML 提供了有序列表、无序列表和自定义列表三种类型&#xff0c;满足不同场景下的内容展示需求。本文将深入探讨这三种列表的…...

【DeepSeek应用】DeepSeek模型本地化部署方案及Python实现

DeepSeek实在是太火了,虽然经过扩容和调整,但反应依旧不稳定,甚至小圆圈转半天最后却提示“服务器繁忙,请稍后再试。” 故此,本文通过讲解在本地部署 DeepSeek并配合python代码实现,让你零成本搭建自己的AI助理,无惧任务提交失败的压力。 一、环境准备 1. 安装依赖库 …...

基于“动手学强化学习”的知识点(六):第 19 章 目标导向的强化学习(gym版本 >= 0.26)

第 19 章 目标导向的强化学习&#xff08;gym版本 &#xff1e; 0.26&#xff09; 摘要 摘要 本系列知识点讲解基于动手学强化学习中的内容进行详细的疑难点分析&#xff01;具体内容请阅读动手学强化学习&#xff01; 对应动手学强化学习——目标导向的强化学习 import torch…...

Vue 中的 MVVM、MVC 和 MVP 模式深度解析

文章目录 1. 模式概览与核心概念1.1 模式定义1.2 架构对比图 2. MVC 模式详解2.1 MVC 流程图2.2 Vue 中的 MVC 实现 3. MVP 模式详解3.1 MVP 流程图3.2 Vue 中的 MVP 实现 4. MVVM 模式详解4.1 MVVM 流程图4.2 Vue 中的 MVVM 实现 5. 模式对比分析5.1 职责对比5.2 通信方式对比…...

金融时间序列分析(Yahoo Finance API实战)

这里写目录标题 金融时间序列分析(Yahoo Finance API实战)1. 引言2. 项目背景与意义3. 数据集介绍4. GPU加速在数据处理中的应用5. 交互式GUI设计与加速处理6. 系统整体架构7. 数学公式与指标计算8. 完整代码实现9. 代码自查与BUG排查10. 总结与展望金融时间序列分析(Yahoo …...

基于DeepSeek×MWORKS 2025a的ROM Builder自动化降阶实战

一、引言 当前&#xff0c;工业仿真领域正经历着前所未有的「智能焦虑」——当自动驾驶算法已能理解城市路网&#xff0c;当大模型开始设计蛋白质结构&#xff0c;这个驱动大国重器研发的核心领域&#xff0c;却仍在与千万级方程组成的庞杂模型艰难博弈。传统仿真降阶如同在数…...

python socket库详解

socket是 Python 标准库中的一个模块&#xff0c;提供了对底层网络通信的接口&#xff0c;允许开发者进行网络编程。通过 socket你可以创建客户端和服务器应用程序&#xff0c;实现网络通信。 1. 基本概念 - Socket&#xff1a;是网络通信的端点&#xff0c;用于在不同主机之间…...

入门基础项目-前端Vue_02

文章目录 1. 用户信息1.1 整体设计1.2 完整代码 User.vue1.2.1 数据加载1.2.2 表格 el-table1.2.2.1 多选1.2.2.2 自定义列的内容 Slot1.2.2.3 图片 el-image1.2.2.4 分页 el-pagination 1.2.3 编辑1.2.3.1 弹出框 el-dialog1.2.3.2 上传 el-upload 1.2.4 新增1.2.5 删除1.2.6 …...

为什么 Young GC 比 Full GC 快

在 JVM 中&#xff0c;Young GC&#xff08;Minor GC&#xff09;比 Full GC 快很多&#xff0c;主要是因为两者在内存区域、回收对象的数量、算法复杂度等方面存在本质上的区别。 内存区域的区别 Young GC&#xff08;Minor GC&#xff09;只发生在新生代&#xff08;Young G…...

【愚公系列】《高效使用DeepSeek》009-PPT大纲自动生成

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…...

Qt6.8.2中JavaScript调用WebAssembly的js文件<1>

前段时间已经学习了如何在QtAssembly中编译FFmpeg资源了&#xff0c;接下来需要使用Html来调用QtCreator中WebAssembly套件写的功能&#xff0c;逐步实现javascrpt与c复杂功能的视线。 接下来我先为大家介绍一个非常简单的加法调用吧&#xff01; 功能讲解 开发环境&#xf…...

【虚幻C++笔记】枚举UENUM、结构体USTRUCT

目录 枚举(UENUM)第一种:使用命名空间第二种:继承uint8通过申明class类别名来替代 结构体(USTRUCT) 枚举(UENUM) 第一种:使用命名空间 UENUM(BlueprintType) namespace MyEnumType {enum MyCustomEnum{Type1,// 或者使用带 DisplayName别名 > Enum1 UMETA(DisplayName &q…...

【mysql】centOS7安装mysql详细操作步骤!—通过tar包方式

【mysql】centOS7安装mysql详细操作步骤&#xff01; linux系统安装mysql版本 需要 root 权限&#xff0c;使用 root 用户进行命令操作。使用tar文件包&#xff0c;安装&#xff0c;gz包也可以但是还需要配置用户&#xff0c;tar包虽然大&#xff0c;但是全啊&#xff01; 1. …...

Linux 下 MySQL 8 搭建教程

一、下载 你可以从 MySQL 官方下载地址 下载所需的 MySQL 安装包。 二、环境准备 1. 查看 MySQL 是否存在 使用以下命令查看系统中是否已经安装了 MySQL&#xff1a; rpm -qa|grep -i mysql2. 清空 /etc/ 目录下的 my.cnf 执行以下命令删除 my.cnf 文件&#xff1a; [roo…...

单口路由器多拨号ADSL实现方法

条件是多拨号场景&#xff0c;公司路由器接口不够用...

最新版VMware 17.6.3安装包分享

修复 Windows 11 主机无响应问题&#xff1a;Windows 11 主机锁定或解锁后&#xff0c;虚拟机可能变得无响应&#xff0c;此问题已在 17.6.3 版本中解决。 解决虚拟机启动崩溃问题&#xff1a;在某些系统上启动虚拟机后&#xff0c;Workstation Pro 可能会崩溃&#xff0c;新版…...

Java高频面试之集合-12

hello啊&#xff0c;各位观众姥爷们&#xff01;&#xff01;&#xff01;本baby今天来报道了&#xff01;哈哈哈哈哈嗝&#x1f436; 面试官&#xff1a;HashMap 的 hash 函数是怎么设计的? HashMap的hash函数设计核心在于减少碰撞、提高数据分布均匀性&#xff0c;具体实现…...

视频推拉流EasyDSS案例分析:互联网直播/点播技术与平台创新应用

随着互联网技术的快速发展&#xff0c;直播/点播平台已成为信息传播和娱乐的重要载体。特别是在电视购物领域&#xff0c;互联网直播/点播平台与技术的应用&#xff0c;不仅为用户带来了全新的购物体验&#xff0c;也为商家提供了更广阔的营销渠道。传统媒体再一次切实感受到了…...

【黑马点评|项目】万字总结(下)

文章上半部分&#xff1a; 【黑马点评|项目】万字总结&#xff08;上&#xff09; 优惠卷秒杀 当用户抢购时&#xff0c;就会生成订单并保存到tb_voucher_order这张表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xff1a; id的规律性太明显&#xff0c;容易出…...

[数据结构]排序之 直接选择排序

1 基本思想&#xff1a; 每一次从待排序的数据元素中选出最小&#xff08;或最大&#xff09;的一个元素&#xff0c;存放在序列的起始位置&#xff0c;直到全部待排序的 数据元素排完 。 2 直接选择排序 : 在元素集合 array[i]--array[n-1] 中选择关键码最大 ( 小 ) 的数据元素…...

前端工程化之前端工程化详解 包管理工具

前端工程化详解 & 包管理工具 前端工程化什么是前端工程化前端工程化发展脚手架能力 体验度量规范流程效能流程扭转 稳定性建设针对整体稳定性建设 可监控&#xff1a;前端监控系统 包管理工具npm包详解package.jsonname 模块名description 模块描述信息keywords&#xff1…...

深入解析 React Diff 算法:原理、优化与实践

深入解析 React Diff 算法&#xff1a;原理、优化与实践 1. 引言 React 作为前端领域的标杆框架&#xff0c;采用 虚拟 DOM&#xff08;Virtual DOM&#xff09; 来提升 UI 更新性能。React 的 Diff 算法&#xff08;Reconciliation&#xff09; 是虚拟 DOM 运行机制的核心&a…...

Linux 蓝牙音频软件栈实现分析

Linux 蓝牙音频软件栈实现分析 蓝牙协议栈简介蓝牙控制器探测BlueZ 插件系统及音频插件蓝牙协议栈简介 蓝牙协议栈是实现蓝牙通信功能的软件架构,它由多个层次组成,每一层负责特定的功能。蓝牙协议栈的设计遵循蓝牙标准 (由蓝牙技术联盟,Bluetooth SIG 定义),支持多种蓝牙…...

PySide(PyQt),使用types.MethodType动态定义事件

以PySide(PyQt)的图片项为例&#xff0c;比如一个视窗的场景底图是一个QGraphicsPixmapItem&#xff0c;需要修改它的鼠标滚轮事件&#xff0c;以实现鼠标滚轮缩放显示的功能。为了达到这个目的&#xff0c;可以重新定义一个QGraphicsPixmapItem类&#xff0c;并重写它的wheelE…...

2.5 python接口编程

在现代软件开发的复杂生态系统中&#xff0c;不同系统、模块之间的交互协作至关重要。接口编程作为一种关键机制&#xff0c;定义了组件之间的通信规范与交互方式。Python 凭借其卓越的灵活性、丰富的库资源以及简洁易读的语法&#xff0c;在接口编程领域占据了重要地位&#x…...

SpringData JPA事务管理:@Transactional注解与事务传播

文章目录 引言一、事务基础概念二、Transactional注解详解2.1 基本用法2.2 属性配置2.3 类级别与方法级别 三、事务传播行为详解3.1 REQUIRED&#xff08;默认&#xff09;3.2 REQUIRES_NEW3.3 其他传播行为 四、事务隔离级别五、事务最佳实践5.1 正确设置事务边界5.2 合理使用…...

第2章、WPF窗体及其属性

1、窗体的宽与高。 2、启动窗体设置 3、窗体的启动位置设置 4、窗体图标更换 5、应用程序的图标更改 6、 7、窗体属性汇总&#xff1a; AllowsTransparency 类型: bool 描述: 该属性决定窗口是否可以有透明效果。如果设置为true&#xff0c;窗口的背景必须设置为Transpar…...

关于ModbusTCP/RTU协议对接Ethernet/IP(CIP)协议的方案

IGT-DSER智能网关模块支持西门子、倍福(BECKHOFF)、罗克韦尔AB&#xff0c;以及三菱、欧姆龙等各种品牌的PLC之间通讯&#xff0c;支持Ethernet/IP(CIP)、Profinet(S7)&#xff0c;以及FINS、MC等工业自动化常用协议&#xff0c;同时也支持PLC与Modbus协议的工业机器人、智能仪…...