这道题使用的是贪心,即贪心使得每一位为0或者每一位为1,如果都无法完成,则输出“no”,需要注意的是,我们不能仅仅判断一个字符串能否变为全1
或全0.比如“001”字符串只能变为全1而无法变为全0.
具体做法是从前往后将每一位变为1/0.若需要修改,则需同时修改两位
Java代码
import java.util.Scanner;
class Main {
public static boolean check(String x, char flag) {
char[] s = new char[x.length()];
for (int i = 0; i < x.length(); i++)
s[i] = x.charAt(i);
for (int i = 0; i + 1 < x.length(); i++) {
if (s[i] == flag) continue; //如果相等,则不需要修改
if (s[i] == '1') s[i] = '0'; //否则连续修改后两位
else s[i] = '1';
if (s[i + 1] == '1') s[i + 1] = '0';
else s[i + 1] = '1';
}
if (s[x.length() - 1] == flag) //前n-1个字符已经符合条件了,最终判断最后一个字符是否符合条件
return true;
return false;
}
public static void main(String[] args) {
String s;
Scanner scanner = new Scanner(System.in);
s = scanner.next();
if (check(s, '1') || check(s, '0'))
System.out.println("yes");
else
System.out.println("no");
}
}
Python代码
def check(s,flag):
for i in range(len(s)-1):
if (s[i] == flag): continue; #如果相等,则不需要修改
if (s[i] == '1'): s[i] = '0'; #否则连续修改后两位
else: s[i] = '1';
if (s[i + 1] == '1'): s[i + 1] = '0';
else: s[i + 1] = '1';
if s[len(s)-1]==flag:return True #前n-1个字符已经符合条件了,最终判断最后一个字符是否符合条件
return False
s=input()
s=list(s)
if check(s,'0') or check(s,'1'):
print("yes")
else:
print("no")
C++代码
#include <bits/stdc++.h>
using namespace std;
string s;
bool check(string s, char flag) {
for (int i = 0; i + 1 < s.size(); i++) {
if (s[i] == flag) continue; //如果相等,则不需要修改
if (s[i] == '1') s[i] = '0'; //否则连续修改后两位
else s[i] = '1';
if (s[i + 1] == '1') s[i + 1] = '0';
else s[i + 1] = '1';
}
if (s[s.size() - 1] == flag) return true; //前n-1个字符已经符合条件了,最终判断最后一个字符是否符合条件
return false;
}
int main() {
cin >> s;
if (check(s, '1') || check(s, '0')) cout << "yes" << endl;
else cout << "no" << endl;
return 0;
}
在一个遥远的国度,有一个名叫小红的年轻人,他拥有着卓越的智慧和勇气。他居住在一个古老的城镇里,这个城镇有一个叫做雾林的地方,这里的植被茂密,空气中弥漫着令人清新的芳香,被誉为这个城镇最美丽的地方。
这个城镇最近受到了来自敌方的威胁,他们派出了一支强大的军队来攻打城镇。小红被任命为城镇的防御指挥官,并被赋予了一个重要的任务:破解敌方的通信密码。他需要在短时间内破译密码,才能获得战斗的胜利。
敌方的密码是一个只包含 01 的字符串,而且它非常长,所以小红想知道是否存在一种操作方式,可以将这个字符串转换为全 0 串或全 1 串。他每次可以选择两个连续的下标,并对该下标的元素对 1 做异或操作( 0 变 1 , 1 变 0 )。
为了成功地破解密码,小红需要你的帮助。
输入一个只包含字符0或者1的字符串s(1≤∣s∣≤1000000)
如果可以转化为全0串或者全1串,输出"yes",否则输出"no"(不含引号)
输入1
010
输出1
yes
输入2
0001
输出2
no