标签:
二进制、字典序
题目:
有一个二进制字符串num,可以选择该串中的任意一段区间进行取反(可以进行一次或不进行),取反指将00变为11,将11变为00。那么取反之后的numnum可能的最大的字典序是多少呢。如果有num=1000,将区间[num2,…,num4]取反变为1111是字典序最大的。
示例1
输入:“1000”
返回值:“1111”
示例2
输入:“1001”
返回值:“1111”
说明:对区间[num2,num3]取反能使得字典序最大。
反思:
做二进制取反这道题目的时候,需要先弄懂,什么时候是二进制字典序最大这个问题。
二进制字典序最大:这里最大的字典序就是这个字符串从左向右来看,前面尽可能都是1。(其实只要把最左边的连续0全部翻转成1就可以了)
然后基本就可以做出来了,这里记录是为了让自己记住二进制字典序最大是把最左边的连续0全部翻转成1就可以了,但是还要注意一下开头是0的情况。
虽然自己写出来了,但是还是参考一下别的高手的代码,希望我能变成他们一样哈哈哈。
用到的知识点:
二进制、字符串
代码:
高手的
public String maxLexicographical1(String num) {
int n = num.length(), i = 0;
char[] chars = num.toCharArray();
while (i < n && chars[i] == '1')
++i;
while (i < n && chars[i] == '0') {
chars[i] = '1';
++i;
}
return String.valueOf(chars);
}
自己的
public String maxLexicographical(String num) {
// write code her
char[] chars = num.toCharArray();
// 如果是第一个字符是0
if (chars[0] == '0') {
int oneIndex = num.indexOf("1");
if (oneIndex == -1) {
return num.replaceAll("0", "1");
}
String pre = num.substring(0, oneIndex).replaceAll("0", "1");
return pre + num.substring(oneIndex, num.length());
}
// 遍历
for (int i = 0; i < chars.length; i++) {
if (chars[i] != '1') {
int nextOneIndex = num.indexOf('1', i);
if (nextOneIndex == -1) {
return num.replaceAll("0", "1");
}
return num.substring(0, nextOneIndex).replaceAll("0", "1") + num.substring(nextOneIndex, num.length());
}
}
return num;
}