leetcode每日一题(1702. 修改后的最大二进制字符串)

题目描述

在这里插入图片描述

题解

这道题贪心的思想,我们只需要尽可能多的把0变成1,而且进行操作1才能使其变大。观察发现以下几点:

  • 不论原字符串有多少个0,最后都会剩余1个0。
    • 假设原字符串只有一个0,不能进行任何操作,显然结论成立。
    • 假设我们遇到一个0,紧跟着他的是0,那么我们一定会进行操作1,才能得到最大的,即变成10;
    • 假设我们遇到一个0,遇到若干个1,然后再遇到0。即01…10,这种情况我们就需要从右往左处理,使得我们能进行操作1(使高位变成1)。显然进行若干次操作2,0的个数不变,然后进行一次操作1,0的个数变为1。
  • 第一个0的位置是idx,那么后边出现cnt个0,最后剩余的1个0的位置就向右移到cnt位,即idx + cnt - 1。要使最后得到的字符串最大,那么一定是进行了操作1,结论显然成立。

代码实现

class Solution {
    public String maximumBinaryString(String binary) {
        int idx = binary.indexOf('0');
        if(idx < 0){
            return binary;
        }
        int n = binary.length(), cnt = 0;
        char[] c = new char[n];
        for(int i = 0; i < n; i ++){
            if(binary.charAt(i) == '0'){
                idx ++;
            }
            c[i] = '1';
        }
        c[idx - 1] = '0';
        return new String(c);
    }
}
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值