联想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)
            

#前缀和#
全部评论

相关推荐

07-11 22:27
中南大学 Java
程序员牛肉:学历的话没问题。但是没问题的也就只有学历了。 其实你的整体架构是正确的,博客接着干。但是项目有点过于简单了。从后端的角度上讲,你这也就是刚入门的水平,所以肯定约面试够呛。 如果你要应聘后端岗位,那你第一个项目竟然是仿写操作系统。这个你要面试官咋问你。你一定要记住一点,你简历上写的所有的东西,都是为了证明你有能力胜任当前的岗位,而不是为了证明你自己会什么。 如果你只是浅浅的做几个项目,描述也都是烂大街。技术点也都是各种混水类的配置类需求,那你就不要幻想自己能走多远。一定要保持思考,保持学习。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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