列表

详情


NC172. 二进制取反

描述

有一个二进制字符串,可以选择该串中的任意一段区间进行取反(可以进行一次或不进行),取反指将变为,将变为。那么取反之后的可能的最大的字典序是多少呢。如有,将区间取反变为是字典序最大的。

示例1

输入:

"1000"

输出:

"1111"

说明:

如题意描述。

示例2

输入:

"1001"

输出:

"1111"

说明:

对区间[num_2,num_3]取反能使得字典序最大。

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 2ms, 内存消耗: 408KB, 提交时间: 2021-11-29

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @return string字符串
     */
    string maxLexicographical(string num) {
        // write code here
        
    int n = num.length();
    if (n == 0)
        return num;

    int kl = -1;
    int kr = n;

    for (int i = 0; i < n; i++)
    {
        if (num[i] == '0' && kl == -1)
        {
            kl = i;
        }
        if (num[i] == '1' && kl != -1)
        {
            kr = i;
            break;
        }
    }

    if (kl != -1)
    {
        for (int i = kl; i < kr; i++)
        {
            num[i] = '1';
        }
    }

    return num;
        
    }
};

C++ 解法, 执行用时: 2ms, 内存消耗: 416KB, 提交时间: 2021-10-23

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @return string字符串
     */
    string maxLexicographical(string num) {
        // write code here
        int len=num.size();
        if(len==0)return num;
        
        int index=-1;
        for(int i=0;i<len;i++){
            if(num[i]=='0'){
                index=i;
                break;
            }
        }
        if(index==-1)return num;
        
        int cnt=0;
        while(index+cnt<len&&num[index+cnt]=='0'){
            num[index+cnt]='1';
            cnt++;
        }
        return num;
    }
};

C 解法, 执行用时: 2ms, 内存消耗: 420KB, 提交时间: 2022-02-10

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param num string字符串 
 * @return string字符串
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
char* maxLexicographical(char* num ) {
    // write code here
    char* c = num;
    while(*c!=0){
        if(*c == '1'){
            c = c+1;
            continue;
        }else{
            while(*c=='0'){
                *c = '1';
                c = c+1;
            }
            break;
        }
    }
    return num;
}

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-07-12

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @return string字符串
     */
    string maxLexicographical(string num) {
        bool flag = false;
        for(int i = 0;i<num.size();i++){// write code here
            if(num[i] == '0'){
               flag = true;
               num[i] = '1';
            }else if(flag && num[i]=='1'){
                break;
            }
        }
        return num;
   }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 396KB, 提交时间: 2022-05-05

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param num string字符串 
     * @return string字符串
     */
    string maxLexicographical(string num) {
       int l=-1; int r=num.size()-1;
        for(int i=0; i<num.size(); i++)
        {
            if(num[i]=='0' && l==-1) l=i;
            if(num[i]=='1' && l!=-1)
            {
                r=i-1;
                break;
            }
        }
        if(l==-1) return num;
        for(int i=l; i<=r; i++) num[i]='1';
        return num;
    }
};

上一题