2025-04-12:将日期转换为二进制表示。用go语言,给定一个字符串格式为 yyyy-mm-dd 的日期,表示一个公历日期。
【摘要】 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。
过程步骤:
-
输入字符串:
- 接收一个格式为
yyyy-mm-dd
的日期字符串,例如"2080-02-29"
。
- 接收一个格式为
-
分割字符串:
- 将输入字符串切分为三部分:年份(
yyyy
)、月份(mm
)和日期(dd
)。 - 具体操作是从字符串中提取前四个字符作为年份,接下来的两个字符作为月份,最后的两个字符作为日期。
- 将输入字符串切分为三部分:年份(
-
将字符串转换为整数:
- 对提取出来的年份、月份和日期字符串,分别使用整数转换函数(如
strconv.Atoi
)将其转换为整数类型,以便进行后续处理。
- 对提取出来的年份、月份和日期字符串,分别使用整数转换函数(如
-
将整数转换为二进制表示:
- 定义一个函数,用于把整数转换为二进制字符串。
- 使用位运算将整数的每一位提取出来。
- 通过右移操作依次获取各个二进制位。
- 将获取到的二进制位以字符串的形式保存,但需要注意要避免前导零的产生。通常采用从低位到高位的顺序拼接字符串,最后翻转字符串得到正确的二进制表示。
- 定义一个函数,用于把整数转换为二进制字符串。
-
组合结果:
- 将年份、月份和日期的二进制字符串在中间用短横线(
-
)隔开,按照year-month-day
的格式返回最终结果。
- 将年份、月份和日期的二进制字符串在中间用短横线(
-
输出结果:
- 输出构造好的字符串,作为该日期的二进制表示。
复杂度分析:
-
时间复杂度:
- 将年份、月份和日期转换成二进制的时间复杂度主要取决于这些数字的位数。一般来说,年份最多为
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)