游酷盛世笔试

小红的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 回复 分享
发布于 今天 01:34 北京
你这个是不是不对啊
点赞 回复 分享
发布于 昨天 21:57 湖北

相关推荐

昨天 10:42
游鲨_内容运营
腾网米等10家大公司 系统策划 1万-1万8
点赞 评论 收藏
分享
Vitalis_:给你一些我的经验参考,学校是你隔壁的那个,我刚刚才开始实习,找了一家手机厂,可能算中厂(不知道算不算中大厂),之前上学期也看过你的帖子,那时候我甚至才开始学java。 我从过完年上班的第一天开始投,然后一开始连小厂都没有面试,但是再过一周继续去海投,陆续有一些小厂给了面试,然后无论线上线下的,都直接开面,最后小厂方面五家过了四家,中厂大厂,就只有这家手机厂给了我机会,然后它只有一面没算法就过了,项目只问了第二个,八股一点没问,可能比较幸运。 前几天还有字节的面邀,但是我怕脏面评,而且已经来了手机厂了,所以拒了面邀。 所以从我个人感受来看,找实习主要就是看运气,就是需要合适的时间点+运气,项目啥的其实都不是很重要,所以就是海投海投海投,有面试机会就抓住就完了。 所以如果我是你的话,就一边背八股(只抓重点背,比如先背heima那个),一边海投,官网也投,有面试就面。 这样如果说可能四月中下旬了还没找到,那再去准备考研也完全不迟的(考你们本校的话),希望能给到你一些参考
点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客企业服务