华为od统一考试B卷【五子棋迷】python 实现,双指针+滑动窗口

本文介绍了如何利用双指针和滑动窗口的策略来解决字符替换问题,以找到字符串中最长的子集,在替换不超过k个字符后,该子集中的所有字符都是相同的。同时,展示了具体的Python代码实现,包括一个用于计算最长子集的函数以及一个处理特定数值列表的示例应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 思路:

双指针+滑动窗口

模板:求最长子集

class Solution(object):
    def characterReplacement(self, s, k):
        """
        :type s: str
        :type k: int
        :rtype: int
        """
        n = len(s)
        ans = 0
        #统计字符数量
        counter = collections.Counter()
        left = 0
        right = 0
        while right < n:
            #统计字符数量
            counter[s[right]] += 1
            #左指针滑动条件,通常是不符合哪些情况
            while right -left + 1 - counter.most_common()[0][1] > k:
                counter[s[left]] -= 1
                left += 1
            ans = max(ans,right - left + 1)
            right += 1
        return ans

 本题:输入格式自己去写吧,直接调用函数即可

import collections


def function(numList:List[int],nums) -> int:
    n = len(numList)
    counter = collections.Counter()
    left = 0
    right = 0
    ans = 0
    pos = []
    while right < n:
        counter[numList[right]] += 1
        while counter[-nums] > 0 or right - left + 1 - counter[nums] > 1:
            counter[numList[left]] -= 1
            left += 1
        if ans < right-left + 1:
            ans = right - left + 1
            for i,x in enumerate(numList[left:right + 1]):
                if x == 0:
                    pos = [left + i]
        elif ans == right - left + 1:
            for i, x in enumerate(numList[left:right + 1]):
                if x == 0:
                    pos.append(left + i)
        right += 1
    mid = (n-1)//2
    pos.sort(key=lambda x : abs(x - mid))
    return pos[0]

numsList = [-1,0,1,1,1,0,1,-1,1]
# numsList = [0,0,0,0,1,0,0,0,0,1,0]

print(function(numsList,-1))

五子棋是一种双人对弈的棋类游戏,玩家通过在棋盘上落子,以先在横、竖、斜线上连成五个相同棋子的线条为目标。根据引用\[1\]中的描述,张兵和王武是五子棋,他们经常在工作之余切磋棋艺。引用\[1\]中给出了一个棋盘上棋子的分布,其中-1代表白子,0代表空位,1代表黑子。根据引用\[2\]和引用\[3\]中的代码,这是一个求解最长子集的问题,其中给出了一个函数characterReplacement,它的输入是一个字符串s和一个整数k,输出是一个整数。这个函数的作用是找到一个最长的子集,使得子集中的字符可以通过替换k次字符来得到。在这个问题中,我们可以将棋盘上的棋子分布看作是一个字符串s,将k看作是允许替换的次数。函数的返回值是最长子集的长度。根据引用\[3\]中的代码,我们可以调用这个函数来求解五子棋问题。 #### 引用[.reference_title] - *1* [华为OD机试 - 五子棋(Java & JS & Python)](https://blog.youkuaiyun.com/qfc_128220/article/details/130766999)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [华为od统一考试B五子棋python 实现双指针+滑动窗口](https://blog.youkuaiyun.com/L_goodboy/article/details/130893746)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

医学小达人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值