每日一题:修改后的最大二进制字符串

给你一个二进制字符串 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"

纯思维题,需要在两个对字符串的操作中找到规律。考虑两个操作:

00 -> 10,数字变大了,符合最大二进制字符串的所求。

10 -> 01,数字变小了,那么我们为什么需要这个操作?他的意义是什么?

能够显而易见想到的就是010,通过10 -> 01,虽然单步变小了,但修改后变为001,进而使用00 -> 10,最终得到101,整体是变大的。

观察010 -> 001,操作2的起到的作用是什么?

将1右移,将0连起来,进而能够使用操作1对整体进行扩大。

那么将示例按照这个思路解析:

  • "000110" -> "000101"
  • "000101" -> "000011"  到此已经将所有0连续起来。

继续考虑所有连续的0最终会变成什么?

00 -> 10,0000就会变成1000,再变成1100,再变成1110。即000011 -> 111011。

使用上面的过程多分析几个字符串就能得到规律:

  1. 通过操作2,可以将101010001这种1/0交替的字符串变成100000111这种1...0...1交替的字符串。
  2. 再通过操作1,可以将连续的0,变成仅最后一位为0,其余位为1的字符串。00000 -> 11110。

也就是说,最终得到的最大二进制字符串中,最多只有一个0。

而且这个0的位置可以通过原字符串中1和0出现的次数,以及第一个0出现的位置确定。

以10101001为例:

  • 首先出现0之前的1是不需要改动的。
  • 记录第一个出现0的位置,zero_first = 1。
  • 遍历字符串得到所有0的个数,num = 4。
  • 那么按照上面的分析,原字符串可以变成10000111。
  • 进而变成11110111,剩余0的位置位于下标  zero_first + num -1处。

这里剩余的问题就是严格证明为什么按照这个流程下来得到的数是最大的。

从直觉上,想让字符串变大,就尽可能的让所有字符是1,并且如果有0,0的位置要尽量靠后。上面过程得到的结果正符合这个直觉。

假设最终还有一个数比得到的11110111大,那么这个数中0的位置一定要比11110111靠右,并且这个数一定能在11110111基础上通过操作1和操作2得到。而操作1和操作2中将字符串变大的操作需要至少两个0,而11110111只有1个0,所以不存在这个数。

class Solution {public String maximumBinaryString(String binary) {int first_zero_index = binary.indexOf('0');int zero_count = 0;int length = binary.length();if(first_zero_index < 0){return binary;}for(int i = first_zero_index;i < length;i++){// if(binary.charAt(i) == '0'){//     zero_count++;// }zero_count -= binary.charAt(i) - '1';}return "1".repeat(first_zero_index + zero_count - 1) + "0" + "1".repeat(length - zero_count - first_zero_index);}
}

这里还有一个值得注意的地方,关注代码中注释掉的部分。他们的效率差别会有多大?

            // if(binary.charAt(i) == '0'){//     zero_count++;// }zero_count -= binary.charAt(i) - '1';

原因:

  • 字符比较(binary.charAt(i) == '0')需要将字符转换为数字进行比较,这是一个相对耗时的操作。
  • 字符减法(binary.charAt(i) - '1')直接将字符转换为数字,然后执行减法运算,这是一个更快的操作。

因此,对于长字符串,zero_count -= binary.charAt(i) - '1' 的效率将比 binary.charAt(i) == '0' 高得多。

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

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

相关文章

【leetcode面试经典150题】34.有效的数独(C++)

【leetcode面试经典150题】专栏系列将为准备暑期实习生以及秋招的同学们提高在面试时的经典面试算法题的思路和想法。本专栏将以一题多解和精简算法思路为主&#xff0c;题解使用C语言。&#xff08;若有使用其他语言的同学也可了解题解思路&#xff0c;本质上语法内容一致&…

OpenHarmony4.0源码解析之媒体框架

媒体框架简介 媒体框架 multimedia_player_framework 主要提供音视频的录制与播放功能。 框架简介 从框架图中可以看出&#xff0c;媒体框架的主要工作模式为通过 Gstreamer 的插件自动化注册及插件组合功能&#xff0c;将其余媒体播放相关的框架功能插件化&#xff0c;配合 …

linux学习:内存(栈,堆,数据段,代码段)

目录 内存 栈内存 堆内存 数据段 代码段 注意 堆 例子 内存 Linux 操作系统为了更好更高效地使用内存&#xff0c;将 实际物理内存进行了映射&#xff0c;对应用程序屏蔽了物理内存的具体细节&#xff0c;有利于简化程序的编写 和系统统一的管理。 假设你正在使用的…

【热门话题】OneFlow深度学习框架介绍

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 OneFlow深度学习框架介绍引言一、OneFlow概述1.1 定位与起源1.2 核心特性数据流…

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet

1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet (从AlexNet到ResNet系列) AlexNet首次亮相是在2012年的ILSVRC大规模视觉识别竞赛上&#xff0c;它将图像分类任务的Top-5错误率降低到15.3%&#xff0c;大幅领先于其他传统方法。AlexNet是首个实用性很强的…

Linux网络名称空间的调试方法全面分析

Linux网络名称空间是一种广泛使用的技术&#xff0c;用于隔离网络环境&#xff0c;特别是在容器化和微服务架构中&#x1f4e6;。然而&#xff0c;随着网络名称空间的广泛应用&#xff0c;开发者和系统管理员可能会遇到需要调试网络名称空间配置和性能的情况&#x1f50d;。本文…

WEB3浪潮下的全新体验:精灵派对链游引领边玩边赚的创新之旅

在当前的数字经济浪潮中&#xff0c;区块链技术以其独特的去中心化特性&#xff0c;正在逐渐改变我们的生活和工作方式。其中&#xff0c;区块链游戏&#xff08;链游&#xff09;作为新兴的领域&#xff0c;正以其独特的优势吸引着全球玩家的目光。在这样一个背景下&#xff0…

split和join的区别

split和join是Python中字符串&#xff08;string&#xff09;类型的两种常用方法&#xff0c;它们用于对字符串进行分割和合并。 1.split() 方法&#xff1a; split() 方法用于将字符串按照指定的分隔符&#xff08;如果没有指定分隔符&#xff0c;则默认为所有的空白字符&am…

C语言学习笔记day18

1. 指针基本概念 1.地址:用来区分内存中不同字节的编号 2.指针:地址就是指针,指针就是地址 3.指针变量:存储指针的变量,有时去掉变量,称为指针 2. 指针运算符 1.&: 1.获得一个变量在内存空间中的首地址 2.让表达式类型升级 2.*: 1.取…

ssm“健康早知道”微信小程序

采用技术 ssm“健康早知道”微信小程序的设计与实现~ 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringMVCMyBatis 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 需求分析 利用ssm、Java、MyEclipse和mysql数据库等知识点&#xff0c;结合相关设…

element-ui自定义table表头,render-header使用

<el-table-column header-align="right" align="right" :render-header="renderHeader"><el-table-column prop="week" label="日期"></el-table-column><el-table-column prop="name" labe…

云卓C20,22倍变焦三轴夜视云台

云卓C20三轴云台&#xff0c;带探照灯&#xff0c;打破光线与空间束缚。具备22倍光学变焦与探照能力&#xff0c;为视觉带来新视角&#xff0c;随时捕捉高清影像&#xff0c;精准搜寻广阔区域。配备变焦高亮聚光灯&#xff0c;强化夜间作业效能与安全保障。适用于公安、电力、救…

[html]网页结构以及常见标签用法

哎&#xff0c;我服了&#xff0c;明明之前学了html的&#xff0c;但时间一长我就忘记了&#xff0c;本来flask学到视图了&#xff0c;但涉及到了html我觉得还是需要重新回顾一下,,,,,, web开发技术栈一共有3门语言。分别是&#xff1a; HTML&#xff1a;译作超文本标记语言&am…

excle如何设置自动显示星期几

目录 一.目的 二.范例结果 三.处理方式 一.目的 excle依据日期&#xff0c;设置后自动显示星期几。 二.范例结果 三.处理方式 公式1TEXT(XXX,DDDD) 公式2TEXT(XXX,DDD)

小程序View点击响应传递多个参数

小程序开发中&#xff0c;view的点击事件是通过bindtap绑定的&#xff0c;比如&#xff1a; <view classpay-button bindtapgotoDetail id{{item.id}}>查看详情</view> 在js文件中是这样获取参数id的&#xff1a; gotoDetail: function(e) {var id e.currentTar…

Java提供了哪些API用于集合类的操作?

Java提供了丰富的API用于集合类的操作。这些API涵盖了各种集合类型&#xff0c;包括List、Set、Queue、Map等&#xff0c;以及它们各自的实现类&#xff0c;如ArrayList、LinkedList、HashSet、LinkedHashSet、PriorityQueue、HashMap、LinkedHashMap等。 以下是一些常用的Jav…

银河麒麟桌面版v10系统安装windows的exe应用-使用CrossOver安装exe软件

银河麒麟桌面版V10系统属于Linux系统&#xff0c;要想在上面运行windows系统下的exe应用是可以实现的&#xff08;理论上可以实现&#xff0c;但实际中受限系统版本&#xff0c;虚拟windows应用的软件版本等多种问题&#xff0c;在安装使用的时候&#xff0c;并不能全部成功&am…

华纳云:Windows系统服务器分盘的操作方法

在Windows服务器的管理中&#xff0c;合理分配磁盘空间对于数据存储和系统运行至关重要。然而&#xff0c;许多用户可能不清楚如何进行磁盘分区操作。本文将介绍Windows系统服务器分盘的操作方法&#xff0c;帮助用户轻松管理磁盘空间。 步骤如下&#xff1a; 打开磁盘管理工具…

Kolla-ansible部署OpenStack集群

0. OpenStack 部署 系统要求 单机部署最低配置&#xff1a; 2张网卡8G内存40G硬盘空间 主机系统&#xff1a; CentOS Stream 9Debian Bullseye (11)openEuler 22.03 LTSRocky Linux 9- Ubuntu Jammy (22.04) 官方不再支持CentOS 7作为主机系统&#xff0c;我这里使用的是R…

第十届蓝桥杯大赛个人赛省赛(软件类) CC++ 研究生组2.0

A立方和 #include<iostream> #include<cmath> using namespace std; int main(){int n, t, flag, x;long long ans 0;for(int i 1; i < 2019; i){t i;flag 0;while(t && !flag){x t % 10;if(x 2 || x 0 || x 1 || x 9) flag 1;t / 10;}if(fl…