2021-10-26 每日打卡:腾讯精选50题

2021-10-26 每日打卡:腾讯精选50题

写在前面

“这些事儿在熟练之后,也许就像喝口水一样平淡,但却能给初学者带来巨大的快乐,我一直觉得,能否始终保持如初学者般的热情、专注,决定了在做某件事时能走多远,能做多好。” 该系列文章由python编写,遵循LeetBook 列表/腾讯的刷题顺序,所有代码已通过。每日3道,随缘剖析,希望风雨无阻,作为勉励自己坚持刷题的记录。

8. 字符串转换整数 (atoi)

在这里插入图片描述

  • 第二遍做啦,状态机
class Solution:
    def myAtoi(self, s: str) -> int:
        INT_MAX = 2**31-1
        INT_MIN = -2**31
        statedic = [
            {"s":0, "c":1, "n":2},
            {"s":3,"c":3,"n":2},
            {"s":3,"c":3,"n":2},
        ]
        state, next_state, res, signal = 0, "o", 0, 1
        for ch in s:
            if ch==" ":
                next_state="s"
            elif ch in "+-":
                next_state = "c"
            elif "0"<=ch<="9":
                next_state = "n"
                res *= 10
                res += (ord(ch) - ord("0"))
                # 注意这里对负数的处理:1. 负号一定要最后加 2. 拿正数比较时要反着来
                res = min(INT_MAX, res) if signal==1 else min(-INT_MIN,res)
            else: break
            state = statedic[state][next_state]
            # 在转移后接着判断,防止下一轮循环发生
            # 状态转移了,才是真正的操作时候,否则“123-”这种,还未转移时就变更了signal
            if state==3:
                break
            elif state == 1: signal =-1 if ch=="-" else 1
        return signal*res 

14. 最长公共前缀

在这里插入图片描述

  • 比较简单,直接纵向比较即可:
class Solution:
    def longestCommonPrefix(self, strs: List[str]) -> str:
        if not strs:
            return ""        
        length, count = len(strs[0]), len(strs)
        for index in range(length):
            c = strs[0][index]
            if any(index == len(strs[num]) or strs[num][index] != c for num in range(1, count)):
                return strs[0][:index]
        
        return strs[0]

15. 三数之和

在这里插入图片描述

  • 双指针碰撞(其实很像滑动窗口,根据当前结果大小而调整):
class Solution:
    def threeSum(self, nums: List[int]) -> List[List[int]]:
        nums.sort()
        n = len(nums)
        res = []
        
        for first in range(n):
            # 设置双指针都以右边,则第一个数大于0,代表找到所有的结果了
            if nums[first]>0:
                return res
            # first>0防止[0, 0, 0],排序后和上一个比较,防止相同
            if first>0 and nums[first]==nums[first-1]:
                continue
            L, R = first+1, n-1

            while L<R:
                if nums[first] + nums[L] + nums[R] == 0:
                    res.append([nums[first],nums[L],nums[R]])
                    # 如果找到合适的,但仍需要判断重复
                    while L<R and nums[L]==nums[L+1]: L += 1
                    while L<R and nums[R]==nums[R-1]: R -= 1
                    # 没有重复的而且找到一个值,继续找值
                    L,R = L+1,R-1
                elif nums[first] + nums[L] + nums[R] > 0: R -= 1
                else: L += 1
        return res

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要找出某个日期的正确上下班打卡时间,你可以使用`datetime`模块进行日期时间的比较和筛选。下面是一个示例代码: ```python import datetime # 打卡数据 data = [ {'日期': '2023-06-10', '开始时间': '2023-06-10 16:27:00', '结束时间': '2023-06-10 17:39:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 01:57:00', '结束时间': '2023-06-11 02:02:00'}, {'日期': '2023-06-11', '开始时间': '2023-06-11 15:57:00', '结束时间': '2023-06-12 01:51:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 08:09:00', '结束时间': '2023-07-01 17:25:00'}, {'日期': '2023-07-01', '开始时间': '2023-07-01 17:32:00', '结束时间': '2023-07-01 17:41:00'} ] target_date = datetime.date(2023, 6, 11) # 指定目标日期 # 遍历打卡数据,找到目标日期的打卡记录 for record in data: record_date = datetime.datetime.strptime(record['日期'], '%Y-%m-%d').date() if record_date == target_date: start_time = datetime.datetime.strptime(record['开始时间'], '%Y-%m-%d %H:%M:%S') end_time = datetime.datetime.strptime(record['结束时间'], '%Y-%m-%d %H:%M:%S') print('开始时间:', start_time) print('结束时间:', end_time) ``` 在上面的示例代码中,我们首先指定目标日期为`2023-06-11`,然后遍历打卡数据,找到与目标日期匹配的记录。然后将开始时间和结束时间转换为`datetime`对象,并打印出来。 你可以根据实际需要修改目标日期和打卡数据,以适应你的情况。 希望对你有所帮助!如果还有其他问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值