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

news/2025/3/17 15:29:39/

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

一、问题描述

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

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

思路分析

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

代码实现

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,填充到最前面。

代码实现(含详细注释)

java">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)

六、总结

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

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


http://www.ppmy.cn/news/1579841.html

相关文章

使用DeepSeek完成一个简单嵌入式开发

开启DeepSeek对话 请帮我使用Altium Designer设计原理图、PCB&#xff0c;使用keil完成代码编写&#xff1b;要求&#xff1a;使用stm32F103RCT6为主控芯片&#xff0c;控制3个流水灯的原理图 这里需要注意&#xff0c;每次DeepSeek的回答都不太一样。 DeepSeek回答 以下是使…

PHP与数据库连接常见问题及解决办法

PHP与数据库连接常见问题及解决办法 在现代Web开发中&#xff0c;PHP与数据库的连接是不可或缺的一部分。无论是构建动态网站、内容管理系统&#xff08;CMS&#xff09;还是电子商务平台&#xff0c;PHP与数据库的交互都是核心功能之一。然而&#xff0c;在实际开发过程中&am…

OpenAI与谷歌DeepMind新品同日竞技,谁能引领机器人现实任务新潮流?

2025年3月12日&#xff0c;科技巨头谷歌DeepMind与OpenAI均发布了与机器人执行现实任务相关的新产品&#xff1a;谷歌DeepMind的新AI模型、OpenAI的Agents工具集&#xff0c;二者在技术路径、应用场景、安全机制设计等方面存在明显差异&#xff0c;其发展态势备受行业关注。 …

SpringBoot 和vue前后端配合开发网页拼图10关游戏源码技术分享

今天分享一个 前后端结合 的网页游戏 开发项目源码技术。 这也是我第一次写游戏类的程序&#xff0c;虽然不是特别复杂的游戏&#xff0c;但是是第一次写&#xff0c;肯定要记录一下了&#xff0c;哈哈。 游戏的内容 就是 我们显示中玩的那个 拼图碎片的 游戏&#xff0c;类似下…

deepseek GRPO算法保姆级讲解(数学原理+源码解析+案例实战)

文章目录 什么是GRPO群组形成(Group Formation):让大模型创建多种解决方案偏好学习(Preference Learning)&#xff1a;让大模型理解何为好的解答组内相对优势 优化(optimization): 让大模型从经验中学习(learning from experience)目标函数 GRPO算法的伪码表示GRPO算法的局限与…

【无监督学习】DBSCAN 聚类步骤及matlab实现

DBSCAN 聚类 DBSCAN 聚类算法1.参数选择2.算法步骤3.MATLAB 实现参考资料 DBSCAN 聚类算法 DBSCAN&#xff08;Density-Based Spatial Clustering of Applications with Noise&#xff09;是一种基于密度的聚类算法&#xff0c;它能够发现任意形状的簇&#xff0c;并且可以有效…

进制转换(十进制相关)

P进制数x→十进制数y int y 0, product 1;//y十进制数&#xff0c;product记录权重 while(x ! 0){y (x % 10) * product;//x%10获取x的个位数x / 10;//去掉x的个位product * p;//下一权重 }8. 九进制转十进制 #include<iostream> using namespace std; int main(){i…

Python 基础知识整理笔记

闹麻了&#xff0c;因为各种原因&#xff0c;现在需要重新回顾一下Python&#xff0c;话不多说&#xff0c;开始吧 1. Python是解释型语言 && Python与C代码执行过程的区别&#xff1a; &#xff08;1&#xff09;C 源码&#xff08;Source&#xff09;&#xff1a;C的…