leecode第18天

3274.检查棋盘方格颜色是否相同
# 给你两个字符串 coordinate1 和 coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。

# 以下是棋盘的参考图。
class Solution:
    """
    该类用于检查两个棋盘格子的颜色是否相同
    """
    
    def checkTwoChessboards(self, coordinate1, coordinate2):
        """
        检查两个棋盘格子的颜色是否相同
        
        :param coordinate1: 第一个棋盘格子的坐标,例如 "A1"
        :param coordinate2: 第二个棋盘格子的坐标,例如 "C3"
        :return: 如果两个棋盘格子的颜色相同返回True,否则返回False
        """
        # 将坐标转换为列表,以便分别处理字母和数字部分
        lst1 = list(coordinate1)
        lst2 = list(coordinate2)
        
        # 将字母部分转换为数字,A对应1,B对应2,以此类推
        char2num1 = ord(lst1[0]) - 97 + 1
        char2num2 = ord(lst2[0]) - 97 + 1
        
        # 判断两个格子的颜色是否相同,通过计算字母和数字的和的奇偶性来确定颜色
        if (int(lst1[1]) + char2num1) % 2 == (int(lst2[1]) + char2num2) % 2:
            return True
        else:
            return False

问题分析与优化建议

潜在问题
  1. 输入验证缺失
    • 当前代码没有对输入的合法性进行验证。如果 coordinate1coordinate2 格式不正确(例如,长度不符合、字母部分超出范围、数字部分非法等),可能会导致运行时错误。
    • 示例:如果输入 "a""a1B",代码会抛出异常。
  2. 边界条件处理不足
    • 假设棋盘大小为标准的 8x8(a-h, 1-8),但代码未限制字母和数字的范围。如果输入超出范围(如 "i1""a9"),可能会返回错误结果。
  3. 异常处理缺失
    • 如果输入包含非字母或非数字字符(如 "a@""1b "),代码会抛出异常。
  4. 代码可读性问题
    • 使用 list() 将字符串拆分为列表后逐个处理字母和数字部分,虽然可以工作,但不够直观。直接通过索引访问字符串的字符会更简洁。
可优化方向
  1. 性能优化

    • 当前代码逻辑已经足够高效,无需进一步提升性能。
  2. 代码可维护性

    • 添加输入验证逻辑,确保输入格式合法。
    • 简化代码结构,避免不必要的变量声明,提高代码可读性。
    • 提供清晰的错误提示信息,便于调试。
    class Solution(object):
        """
        该类用于检查两个棋盘格子的颜色是否相同
        """
        
        def checkTwoChessboards(self, coordinate1, coordinate2):
            """
            检查两个棋盘格子的颜色是否相同
            
            :param coordinate1: 第一个棋盘格子的坐标,例如 "a1"
            :param coordinate2: 第二个棋盘格子的坐标,例如 "c3"
            :return: 如果两个棋盘格子的颜色相同返回True,否则返回False
            """
            def validate_coordinate(coordinate):
                """验证坐标格式是否合法"""
                if len(coordinate) != 2:
                    raise ValueError(f"坐标 {coordinate} 格式不正确,应为 '字母+数字' 的形式")
                letter, number = coordinate[0], coordinate[1]
                if not letter.isalpha() or not number.isdigit():
                    raise ValueError(f"坐标 {coordinate} 包含非法字符")
                if not ('a' <= letter.lower() <= 'h') or not (1 <= int(number) <= 8):
                    raise ValueError(f"坐标 {coordinate} 超出棋盘范围 (a-h, 1-8)")
    
            # 验证输入坐标
            validate_coordinate(coordinate1)
            validate_coordinate(coordinate2)
    
            # 将字母部分转换为数字,a对应1,b对应2,以此类推
            char2num1 = ord(coordinate1[0].lower()) - ord('a') + 1
            char2num2 = ord(coordinate2[0].lower()) - ord('a') + 1
    
            # 判断两个格子的颜色是否相同,通过计算字母和数字的和的奇偶性来确定颜色
            return (int(coordinate1[1]) + char2num1) % 2 == (int(coordinate2[1]) + char2num2) % 2
    
当前提供的引用内容并未涉及 LeetCode 第 25 题的信息。然而,基于已知的 LeetCode 平台题目编号规律以及常见问题分类,可以推测 LeetCode 第 25 题通常是指 **"Reverse Nodes in k-Group"**(k 个一组翻转链表)。以下是关于此问题的专业解答: ### 问题描述 给定一个链表,将其节点按照每 k 个一组进行反转。如果剩余节点不足 k 个,则保持原样。返回修改后的链表。 #### 示例输入输出 ```plaintext Input: head = [1,2,3,4,5], k = 2 Output: [2,1,4,3,5] Input: head = [1,2,3,4,5], k = 3 Output: [3,2,1,4,5] ``` --- ### 解决方案 为了实现这一功能,可以通过迭代的方式处理链表节点组,并利用辅助函数完成单组内的反转操作。具体方法如下: #### 方法概述 1. 使用指针 `start` 和 `end` 定位每一组的第一个和最后一个节点。 2. 对于满足长度为 k 的子链表部分,调用辅助函数对其进行局部反转。 3. 将上一步的结果连接回原始链表结构。 4. 如果最后剩余的部分少于 k 个节点,则不作任何改动。 下面是完整的 Python 实现代码: ```python class ListNode: def __init__(self, val=0, next=None): self.val = val self.next = next def reverseKGroup(head: ListNode, k: int) -> ListNode: dummy = ListNode(0) dummy.next = head prev_group_end = dummy # 跟踪前一段链表的结尾 while True: # 检查是否有足够的节点来形成下一组 current_node = prev_group_end for _ in range(k): if not current_node.next: return dummy.next current_node = current_node.next # 反转当前组 (prev_group_end.next 到 current_node) new_group_start = prev_group_end.next temp_next = current_node.next prev_group_end.next, current_tail = reverseSubList(new_group_start, k) # 连接反转后的组到整体链表 current_tail.next = temp_next prev_group_end = current_tail def reverseSubList(head: ListNode, count: int) -> tuple[ListNode]: """ 辅助函数:用于反转指定数量的节点 """ previous = None current = head for _ in range(count): next_temp = current.next current.next = previous previous = current current = next_temp return previous, head # 返回新的头结点和旧的头结点作为尾部 ``` 上述算法的时间复杂度为 O(n),其中 n 是链表中节点的数量;空间复杂度为 O(1)[^6]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值