2025-04-12:将日期转换为二进制表示。用go语言,给定一个字符串格式为 yyyy-mm-dd 的日期,表示一个公历日期。

举报
福大大架构师每日一题 发表于 2025/04/12 07:09:36 2025/04/12
【摘要】 2025-04-12:将日期转换为二进制表示。用go语言,给定一个字符串格式为 yyyy-mm-dd 的日期,表示一个公历日期。我们可以将此日期转换为二进制格式,只需将年份、月份和日期分别转换为二进制表示(不包括前导零),并按照 year-month-day 的顺序排列。最后,返回这个日期的二进制表示。date.length == 10。date[4] == date[7] == ‘-’,其...

2025-04-12:将日期转换为二进制表示。用go语言,给定一个字符串格式为 yyyy-mm-dd 的日期,表示一个公历日期。

我们可以将此日期转换为二进制格式,只需将年份、月份和日期分别转换为二进制表示(不包括前导零),并按照 year-month-day 的顺序排列。

最后,返回这个日期的二进制表示。

date.length == 10。

date[4] == date[7] == ‘-’,其余的 date[i] 都是数字。

输入保证 date 代表一个有效的公历日期,日期范围从 1900 年 1 月 1 日到 2100 年 12 月 31 日(包括这两天)。

输入: date = “2080-02-29”。

输出: “100000100000-10-11101”。

解释:

100000100000, 10 和 11101 分别是 2080, 02 和 29 的二进制表示。

题目来自leetcode3280。

过程步骤:

  1. 输入字符串

    • 接收一个格式为 yyyy-mm-dd 的日期字符串,例如 "2080-02-29"
  2. 分割字符串

    • 将输入字符串切分为三部分:年份(yyyy)、月份(mm)和日期(dd)。
    • 具体操作是从字符串中提取前四个字符作为年份,接下来的两个字符作为月份,最后的两个字符作为日期。
  3. 将字符串转换为整数

    • 对提取出来的年份、月份和日期字符串,分别使用整数转换函数(如 strconv.Atoi)将其转换为整数类型,以便进行后续处理。
  4. 将整数转换为二进制表示

    • 定义一个函数,用于把整数转换为二进制字符串。
      • 使用位运算将整数的每一位提取出来。
      • 通过右移操作依次获取各个二进制位。
      • 将获取到的二进制位以字符串的形式保存,但需要注意要避免前导零的产生。通常采用从低位到高位的顺序拼接字符串,最后翻转字符串得到正确的二进制表示。
  5. 组合结果

    • 将年份、月份和日期的二进制字符串在中间用短横线(-)隔开,按照 year-month-day 的格式返回最终结果。
  6. 输出结果

    • 输出构造好的字符串,作为该日期的二进制表示。

复杂度分析:

  • 时间复杂度

    • 将年份、月份和日期转换成二进制的时间复杂度主要取决于这些数字的位数。一般来说,年份最多为 11 位(例如 2100),而月份和日期最多各为 7 位(例如 31 的二进制表示为 11111)。因此,对于每一个部分的转化,我们的整体复杂度为常数级 O(1),因为输入的日期范围是有限的。因此,总的时间复杂度可以认为是 O(1)。
  • 空间复杂度

    • 主要消耗在存储转化后的二进制字符串上。最坏的情况下,年份、月份和日期的二进制字符串的总长度是固定的(例如,年份的最大长度为 11,月份和日期的最大长度各为 7,所以整个字符串的长度最多为 25 个字符 + 2(两个短横线) = 27 个字符),因此额外空间复杂度也是 O(1),因为存储所需空间是固定的。

总结:

  • 本程序将日期字符串转换为二进制格式,并使用 O(1) 的时间复杂度和 O(1) 的空间复杂度来处理固定大小的输入。

Go完整代码如下:

package main

import (
	"fmt"
	"strconv"
)

func binary(x int) string {
	var s []byte
	for ; x != 0; x >>= 1 {
		s = append(s, '0'+byte(x&1))
	}
	for i, j := 0, len(s)-1; i < j; i, j = i+1, j-1 {
		s[i], s[j] = s[j], s[i]
	}
	return string(s)
}

func convertDateToBinary(date string) string {
	year, _ := strconv.Atoi(date[:4])
	month, _ := strconv.Atoi(date[5:7])
	day, _ := strconv.Atoi(date[8:])
	return binary(year) + "-" + binary(month) + "-" + binary(day)
}

func main() {
	date := "2080-02-29"
	results := convertDateToBinary(date)
	fmt.Println(results)
}

在这里插入图片描述

Python完整代码如下:

# -*-coding:utf-8-*-

def binary(x):
    if x == 0:
        return '0'
    s = ''
    while x != 0:
        s = str(x & 1) + s  # 将当前位插入字符串的最前面
        x >>= 1  # 右移一位
    return s

def convert_date_to_binary(date):
    year = int(date[:4])
    month = int(date[5:7])
    day = int(date[8:])
    return f"{binary(year)}-{binary(month)}-{binary(day)}"

if __name__ == "__main__":
    date = "2080-02-29"
    results = convert_date_to_binary(date)
    print(results)

在这里插入图片描述

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。