LeetCode-1702. 修改后的最大二进制字符串【贪心 字符串】

news2024/11/27 5:45:32

LeetCode-1702. 修改后的最大二进制字符串【贪心 字符串】

  • 题目描述:
  • 解题思路一:贪心,几个规则。
  • 解题思路二:当前遇到0,去找下一个0的位置,将当前变为00。通过
  • 解题思路三:另一种贪心写法。

题目描述:

给你一个二进制字符串 binary ,它仅有 0 或者 1 组成。你可以使用下面的操作任意次对它进行修改:

操作 1 :如果二进制串包含子字符串 “00” ,你可以用 “10” 将其替换。
比方说, “00010” -> “10010”
操作 2 :如果二进制串包含子字符串 “10” ,你可以用 “01” 将其替换。
比方说, “00010” -> “00001”
请你返回执行上述操作任意次以后能得到的 最大二进制字符串 。如果二进制字符串 x 对应的十进制数字大于二进制字符串 y 对应的十进制数字,那么我们称二进制字符串 x 大于二进制字符串 y 。

示例 1:

输入:binary = “000110”
输出:“111011”
解释:一个可行的转换为:
“000110” -> “000101”
“000101” -> “100101”
“100101” -> “110101”
“110101” -> “110011”
“110011” -> “111011”
示例 2:

输入:binary = “01”
输出:“01”
解释:“01” 没办法进行任何转换。

提示:

1 <= binary.length <= 105
binary 仅包含 ‘0’ 和 ‘1’ 。

解题思路一:贪心,几个规则。

提示 1
答案不会包含 00(连续的 0)。

证明:反证法。假设答案包含 00,我们可以通过操作 1 将其变为 10,从而得到更大的答案。所以答案不会包含 00。

提示 2
答案至多包含一个 0。

证明:反证法。假设至少有两个 0,我们随意选择其中两个 0,由提示 1 可知这两个 0 不相邻。例如 10110,我们可以通过操作 2 将右边的 0「移动」到第一个 0 的右边,即 10011,然后通过操作 1 将其变为 11011。由于左边更高位的 0 变成了 1,所以我们得到了比 10110 更大的答案。一般地,在有多个 0 的情况下,总是可以通过操作 2 让最高位的 0 的右侧也是 0,然后通过操作 1 让最高位的 0 变成 1,从而得到更大的答案。所以答案至多包含一个 0。
在这里插入图片描述

class Solution:
    def maximumBinaryString(self, binary: str) -> str:
        i = binary.find('0')
        if i < 0: # binary 全是 '1'
            return binary
        cnt1 = binary.count('1', i) # 统计 binary[i:] 中 '1' 的个数
        return '1' * (len(binary) - 1 - cnt1) + '0' + '1' * cnt1

时间复杂度:O(n)
空间复杂度:O(1)

解题思路二:当前遇到0,去找下一个0的位置,将当前变为00。通过

s[j] = ‘1’
s[i] = ‘1’
s[i + 1] = ‘0’

class Solution:
    def maximumBinaryString(self, binary: str) -> str:
        n = len(binary)
        s = list(binary)
        j = 0
        for i in range(n):
            if s[i] == '0':
                while j <= i or (j < n and s[j] == '1'):
                    j += 1
                if j < n:
                    s[j] = '1'
                    s[i] = '1'
                    s[i + 1] = '0'
        return ''.join(s)

时间复杂度:O(n)
空间复杂度:O(1)

解题思路三:另一种贪心写法。

class Solution:
    def maximumBinaryString(self, binary: str) -> str:
        n = len(binary)
        i = binary.find("0")
        if i < 0:
            return binary
        zeros = binary.count('0')
        s = ['1'] * n
        s[i + zeros - 1] = '0'
        return ''.join(s)

时间复杂度:O(n)
空间复杂度:O(1)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1582234.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从电工到电气工程师:PLC编程之路

在当前的工业自动化时代&#xff0c;电气工程师的角色变得越来越重要&#xff0c;特别是在掌握了PLC&#xff08;可编程逻辑控制器&#xff09;编程技能后&#xff0c;这一技能不仅能够大幅提升生产效率&#xff0c;还能为企业节省大量成本。对于那些从事电工职业的人来说&…

中科数安 || 透明加密是怎么防止公司办公终端电脑文件资料外泄的?

#企业电脑数据防泄密软件# 中科数安作为一家专注于信息安全领域的公司&#xff0c;其提供的透明加密解决方案旨在通过以下机制来防止公司办公终端电脑上的文件资料外泄&#xff1a; 中科数安 || 公司办公透明加密系统 PC地址&#xff1a;www.weaem.com 实时加密&#xff1a; …

《由浅入深学习SAP财务》:第2章 总账模块 - 2.6 定期处理 - 2.6.1 月末操作:自动清账

2.6.1 月末操作&#xff1a;自动清账 清账是指会计科目的借贷挂账后的核销&#xff0c;包括客户、供应商和实行未清项管理的总账科目等。 总账模块实行未清项管理的科目有GR/IR&#xff08;Goods Receipt/Invoice Receipt&#xff09;、银行存款-清账&#xff08;较少使…

O2OA(翱途)开发平台-如何基于nginx上下文分发的方式快速集群部署

O2OA(翱途)开发平台[下称O2OA开发平台或者O2OA]使用分布式架构设计&#xff0c;提供灵活的扩展方案用于对服务器的负载能力进行扩展&#xff0c;保障系统的高可用性。本篇主要介绍如何基于nginx上下文分发的方式快速集群部署。 O2OA平台应用结构 O2OA服务器默认启动5个服务&am…

51单片机 DS1302

DS1302 实现流程 将提供的ds1302底层参考程序拷贝到工程下 注意在ds1302.c中可能硬件引脚没有定义&#xff0c;注意去看一下。还有头文件什么的在ds1302中记得加上 参考代码&#xff1a; #include "reg52.h" #include "ds1302.h"unsigned char Write_…

Linux网络名称空间与网络协议栈:区别、联系与理解

在深入探讨Linux网络名称空间和网络协议栈之间的区别和联系之前&#xff0c;重要的是先明确这两个概念的定义。网络名称空间是Linux提供的一种虚拟化技术&#xff0c;允许在同一物理机器上运行的不同进程组拥有独立的网络环境&#x1f3e2;。而网络协议栈是操作系统用于实现网络…

【趣味学算法】14_梅森素数

注&#xff1a; 本系列仅为个人学习笔记&#xff0c;学习内容为《算法小讲堂》&#xff08;视频传送门&#xff09;&#xff0c;通俗易懂适合编程入门小白&#xff0c;需要具备python语言基础&#xff0c;本人小白&#xff0c;如内容有误感谢您的批评指正 梅森数&#xff08;Me…

从“执行SQL”到“返回结果”,数据库到底发生了什么?

SQL 全称是 Structured Query Language 结构化查询语言。由于其简单易学、完整安全、灵活且具备高可扩展性&#xff0c;SQL 如今已经成为标准的关系型数据库管理语言。 当连接到数据库&#xff0c;写下一条 SQL 语句&#xff0c;点击“执行”&#xff0c; SELECT name, compa…

1.Spring的核心思想 —— IOC和DI

1. Spring是什么&#xff1f; 简单的说&#xff0c;Spring其实指的是Spring Framework&#xff08;Spring框架&#xff09;&#xff0c;是一个开源框架。 如果要用一句话概括&#xff1a;它是包含众多工具方法的IOC&#xff08;Inverse of Control控制反转&#xff09;容器。…

STC89C52学习笔记(四)

STC89C52学习笔记&#xff08;四&#xff09; 综述&#xff1a;本文讲述了在STC89C51中数码管、模块化编程、LCD1602的使用。 一、数码管 1.数码管显示原理 位选&#xff1a;对74HC138芯片的输入端的配置&#xff08;P22、P23、P24&#xff09;&#xff0c;来选择实现位选&…

相机模型浅析

相机模型 文章目录 相机模型四个坐标系针孔相机模型世界坐标系到相机坐标系相机坐标系到图像坐标系图像坐标到像素坐标 四个坐标系 ①世界坐标系&#xff1a;是客观三维世界的绝对坐标系&#xff0c;也称客观坐标系。因为数码相机安放在三维空间中&#xff0c;我们需要世界坐标…

Java springmvc 参数名用is开头导致为null

因为最近在整理一些源码和编写规范&#xff0c;这里写一下只是记录几年前自己遇到的问题&#xff0c;好久都忘了&#xff0c;还是写下来比较好。 问题记录&#xff1a;由于变量使用了boolean&#xff0c;并且变量名是is开头的&#xff0c;由于java机制boolean默认是false&#…

网络学习学习笔记

NETEBASE学习笔记 一.VRP系统1.四种视图模式2.基础命令 二.TCP/IP1.五层模型 一.VRP系统 1.四种视图模式 (1)< Huawei > 用户视图 【查看运行状态】 (2)[Huawei] 系统视图 【配置设备的系统参数】 system-view /sys 进入系统视图 CtrlZ/return 直接返回用户视图 (3)[Hua…

十六进制前缀为Ox还是0x???

16进制的前缀是0x&#xff0c;数字零和英文字母X。 十六进制&#xff08;英文名称&#xff1a;Hexadecimal&#xff09;&#xff0c;是计算机中数据的一种表示方法。同我们日常生活中的表示法不一样。它由0-9&#xff0c;A-F组成&#xff0c;字母不区分大小写。与10进制的对应…

qq过期文件怎么恢复?3招精准找回丢失的QQ文件

当我们使用QQ进行文件传输时&#xff0c;有时候会遇到一个普遍的问题&#xff1a;过期文件。这些文件由于时间限制或其他原因而在一定时间后自动删除&#xff0c;让人感到烦恼。 然而&#xff0c;对于那些重要的文件&#xff0c;我们可能希望能够恢复并重新获取。qq过期文件怎…

Docker安装及开启远程访问

这几天有人问我docker是怎么开启远程服务的&#xff1f; 正好之前我做过这件事情&#xff0c;并且写了相关的笔记&#xff0c;现在整理为一篇博客发出来。 安装Docker 首先更新一下自己的yum版本 yum update安装一下所需要的软件包 yum-config-manager --add-repo http://…

蓝桥杯中的DFS算法

前言 和上一篇文章一样&#xff0c;这篇文章是介绍蓝桥杯中的第二种暴力算法就是DFS算法&#xff0c;在蓝桥杯中非常常用。 简单介绍 DFS算法中文名就是深度优先算法&#xff0c;在这里就不详细介绍这个算法了&#xff0c;可以自行搜索&#xff0c;网上有很多&#xff0c;或…

Bootstrap 5 保姆级教程(一):容器 网格系统

一、容器 1.1 固定宽度&#xff08;.container&#xff09; .container 类用于固定宽度并支持响应式布局的容器。 以下实例中&#xff0c;我们可以尝试调整浏览器窗口的大小来查看容器宽度在不同屏幕中等变化&#xff1a; <!doctype html> <html lang"en&quo…

线性变换在人工智能领域的深度实践与应用探索

线性变换&#xff0c;作为数学中的一种基本工具&#xff0c;在人工智能领域中发挥着举足轻重的作用。其强大的表示能力和灵活的运算特性使得线性变换成为机器学习、深度学习等多个子领域的核心组成部分。本文将详细探讨线性变换在人工智能领域中的实践应用&#xff0c;旨在揭示…

刷题DAY50 | LeetCode 123-买卖股票的最佳时机III 188-买卖股票的最佳时机IV

123 买卖股票的最佳时机III&#xff08;hard&#xff09; 给定一个数组&#xff0c;它的第 i 个元素是一支给定的股票在第 i 天的价格。 设计一个算法来计算你所能获取的最大利润。你最多可以完成 两笔 交易。 注意&#xff1a;你不能同时参与多笔交易&#xff08;你必须在再…