游酷盛世笔试
小红的01串 坏串“010” “101” 每次可以翻转1位,求坏串变成好串需要的最少翻转次数
#include <iostream>
#include <string>
using namespace std;
bool isTrue(string& s, int& err) {
for (unsigned long i = 0; i < s.size() ; i++) {
if (s[i] == '0') {
if (s.substr(i, 3) == "010") {
err = i;
return false;
}
}
if (s[i] == '1') {
if (s.substr(i, 3) == "101") {
err = i;
return false;
}
}
}
return true;
}
int reverse(string& s, int& err, int& 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 <<"reverse:" <<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("%lld")
#include <iostream>
#include <string>
using namespace std;
bool isTrue(string& s, int& err) {
for (unsigned long i = 0; i < s.size() ; i++) {
if (s[i] == '0') {
if (s.substr(i, 3) == "010") {
err = i;
return false;
}
}
if (s[i] == '1') {
if (s.substr(i, 3) == "101") {
err = i;
return false;
}
}
}
return true;
}
int reverse(string& s, int& err, int& 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 <<"reverse:" <<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("%lld")
全部评论
我的解法是考虑每个位置,当他左右元素和他不相等时再判断(101 010)然后,如果i+2没有越界,再往后考虑一个字符
如果和当前相同(1010)就把后面一位置反(1000),这样就可以同时处理两个坏串(原串假如是10101,改为11101会多处理一次,改成10001就不用处理第二次)
如果不同(1011)就考虑把当前字符置反(1111),同理 这样是防止出现额外的坏串(如10110,假如和上面的情况一样,改为10010,会造成出现新的坏串,改为11110就不会出现)
你这个是不是不对啊
相关推荐
点赞 评论 收藏
分享
03-02 13:55
广东工业大学 Java 点赞 评论 收藏
分享
点赞 评论 收藏
分享