题解 | 小红的01子序列构造(easy)

小红的01子序列构造(easy)

https://www.nowcoder.com/practice/ee0b6c6baa2642c182df8b4390126f9a

from collections import defaultdict

# 双指针 滑动窗口 哈希
n, k = map(int, input().split())
s = input()
left = 0
cur_01 = 0  # 代表当前01子串个数
cache = defaultdict(int)
for i, c in enumerate(s):
    if c == '1':
        cache[1] += 1
        cur_01 += cache[0]  # 此前有多少0,就增加多少01子串
        if cur_01 == k:
            print(left + 1, i + 1)
            break
        while cur_01 > k:  # 加上当前元素后,01子串个数超出要求,移动左指针,减小窗口
            if s[left] == '0':
                cur_01 -= cache[1]  # 0脱离窗口,此后有多少1,就减少多少01子串
                cache[0] -= 1  # 更新cache
            else:
                cache[1] -= 1  # 左1离开窗口,不影响01子串个数
            left += 1
        if cur_01 == k:  # 左指针移动结束,检查是否刚好达到目标
            print(left + 1, i + 1)
            break
    else:
        cache[0] += 1
if cur_01 != k:  # 没找到,输出-1
    print(-1)

使用滑动窗口做法,right指针就是for循环中的i,增加right,直到窗口中01子串超出个数就移动left。如果窗口中个数符合要求,则打印此时的left,right,退出循环。

全部评论

相关推荐

用户64975461947315:这不很正常吗,2个月开实习证明,这个薪资也还算合理,深圳Java好多150不包吃不包住呢,而且也提前和你说了没有转正机会,现在贼多牛马公司骗你说毕业转正,你辛辛苦苦干了半年拿到毕业证,后面和你说没hc了😂
点赞 评论 收藏
分享
吐泡泡的咸鱼:我也工作了几年了,也陆陆续续面试过不少人,就简历来说,第一眼学历不太够,你只能靠你的实习或者论文或者项目经历,然后你没有论文,没有含金量高的比赛和奖项,只能看实习和项目,实习来说,你写的实习经历完全不清楚你想找什么工作?行研?数据分析?且写的太少了,再看项目,这些项目先不说上过大学读过研究生的都知道很水,然后对你想找的岗位有什么帮助呢?项目和实习也完全不匹配啊,你好像在努力将你所有的经历都放在简历里想表现你的优秀,但是对于你想找的岗位来说,有什么用呢?最后只能获得岗位不匹配的评价。所以你需要明白你想要找的岗位要求是什么,是做什么的,比如产品经理,然后再看你的经历里有什么匹配的上这个岗位,或者对这个岗位以及这个岗位所在的公司有价值,再写到你的简历上
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务