联想8.5技术笔试---栅栏涂色 题解

问题:

第一题
问题描述
小A的门前有n个排成一排的栅栏,编号分别为1,2,...,n。每个栅栏都是红色或者蓝色的。但小A觉得目前的上色方案看起来有些杂乱,便想要重新对栅栏进行涂色。具体地,小A认为,如果栅栏的颜色交替次数多于1次,那么就是杂乱的,否则就是整齐的。换言之,如果栅栏是全红/全蓝/前一段红后一段蓝/前一段蓝后一段红,那么都能符合小A的要求。请问小A至少需要对几个栅栏进行重新涂色,才能满足他的要求呢?

输入描述
第一行是一个整数n,表示有n个栅栏,1<=n<=100000。
第二行是一个字符串s,字符串只包含’r’和’b’,对于第i个字符,若为’r’表示第i个栅栏为红色,若为’b’则表示第i个栅栏为蓝色。

输出描述
一行一个整数,表示小A需要进行重新涂色的最少栅栏数。

思路:对于每一个栅栏,计算其左右r还有b的数量,一共4个数组lb,lr,rb,rr去存。遍历每一个元素,计算{全r,全b,rb,br}四种情况下的最小值,并取最小,用这个最小值再去更新答案res。

代码:

#栅栏涂色
while(1):
    line = input().strip()
    if len(line)<=0:break
    
    s = line
    res = 0
    n = len(s)
    lb,lr,rb,rr = [0]*n,[0]*n,[0]*n,[0]*n
    for i in range(1,n):
        lb[i] = lb[i-1]+(1 if s[i-1]=='b' else 0)
        lr[i] = lr[i-1]+(1 if s[i-1]=='r' else 0)
    for i in range(n-2,-1,-1):
        rb[i] = rb[i+1]+(1 if s[i+1]=='b' else 0)
        rr[i] = rr[i+1]+(1 if s[i+1]=='r' else 0)
    res = float('inf')
    for i in range(n):
        if s[i]=='b':
            res = min(1+lb[i]+rb[i],lr[i]+rr[i],lb[i]+rr[i],lr[i]+rb[i])
        else:
            res = min(lb[i]+rb[i],1+lr[i]+rr[i],lb[i]+rr[i],lr[i]+rb[i])
    print(res)
            

#前缀和#
全部评论

相关推荐

2025-12-31 19:23
已编辑
门头沟学院 Java
ssob是已读不回的,字节是压根不敢投的,简历是反反复复改了N遍的,八股是永远背不完的😅😅😅扯远了,道心破碎了,把简历发出来让大伙先看看笑话。再说正事。寒假日常实习还是很难找,连个面试都难约,我不是个例,这是网上普遍反映。不报希望了,趁着2、3月前赶紧做些什么才是。扔几个碎碎念:1.这破简历还能怎么改?写到什么程度才能过实习岗筛选?广大牛友来锐评一下2.火速辅修go,是否可行目前看来是学习成本最小的。首先,很多go实习岗位已经明确要求掌握gin等技术栈,拿java简历投go的时代已经过去了。其次,很多后端的东西,MySQL、Redis这些都是通用的,不用重新学。所以这个问题就具体为:2.1&nbsp;java&amp;go混血简历怎么写第一个项目,仿大麦的微服务,不太好改。因为有用到Redisson、AOP、SpringAI这些java强相关的东西,包装成go需要替换这些方案。第二个,点评魔改。应该可以包装成go,github上也有人用go重写过。2.2&nbsp;java&amp;go通用的轮子RPC直接pass了,太烂大街了。不知道动态线程池能不能做。反正项目上新有风险,不一定来得及,非必要就不开新的项目。补充:别跟我扯RAG了,这玩意已经成新的烂大街了,详见我上一篇的吐槽。3.认真学微调prompt什么的这个半步踩进算法了已经。八股和场景题完全就是另一套,没两三个月搞不定的。约等于换方向
简历中的项目经历要怎么写
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务