游酷盛世笔试

小红的01串 坏串“010” “101”  每次可以翻转1位,求坏串变成好串需要的最少翻转次数
#include <iostream>
#include <string>
using namespace std;

bool isTrue(string&amp; s, int&amp; err) {
    for (unsigned long i = 0; i < s.size() ; i++) {
        if (s[i] == '0') {
            if (s.substr(i, 3) == &quot;010&quot;) {
                err = i;
                return false;
            }
        }
        if (s[i] == '1') {
            if (s.substr(i, 3) == &quot;101&quot;) {
                err = i;
                return false;
            }
        }
    }
    return true;
}

int reverse(string&amp; s, int&amp; err, int&amp; count) {
    if (isTrue(s, err)) {
        return 0;
    }
    int idx = err+1;
    if (s[err] == '1') {
        s[idx] = '1';
    } else {
        s[idx+1] = '1';
    }
    count++;
    // cout <<&quot;reverse:&quot; <<s<<endl;
    reverse(s, err, count);
    return 0;
}
int main() {
    int a;
    cin >> a;
    string s = to_string(a);
    int err = 0, count = 0;
    reverse(s, err, count);
    cout<<count;
}
// 64 位输出请用 printf(&quot;%lld&quot;)
全部评论
我的解法是考虑每个位置,当他左右元素和他不相等时再判断(101 010)然后,如果i+2没有越界,再往后考虑一个字符 如果和当前相同(1010)就把后面一位置反(1000),这样就可以同时处理两个坏串(原串假如是10101,改为11101会多处理一次,改成10001就不用处理第二次) 如果不同(1011)就考虑把当前字符置反(1111),同理 这样是防止出现额外的坏串(如10110,假如和上面的情况一样,改为10010,会造成出现新的坏串,改为11110就不会出现)
1 回复 分享
发布于 03-19 01:34 北京
你这个是不是不对啊
点赞 回复 分享
发布于 03-18 21:57 湖北

相关推荐

评论
点赞
3
分享

创作者周榜

更多
牛客网
牛客企业服务