2 回答
TA贡献1807条经验 获得超9个赞
为了获得最小量1,我们需要每个1处理尽可能多的0,这意味着我们需要重复最大次数。因此,我们可以开始将零替换为从左开始010
010
0000000000 ↓↓↓↓↓↓↓↓↓ 010010010x <- here you can't place another 010 and we have one extra place to fill
如果没有填写整个数字,这意味着我们需要一个或两个数字。010
如果它是一位数,我们该怎么办?我们可以在这里使用吗?让我们看看:会变成?
这是有效的结果吗?否,因为最后一个零附近没有任何零。所以我们不能使用,这给我们留下了喜欢.0
010010010x
0100100100
1
0
1
0100100101
因此,如果我们需要另外一个数字,请将其替换为 .1
现在,当我们有两位数要填充时会发生什么,例如?我们不能使用,因为最后不会有任何相邻的。010010010xx
00
0
1
我们可以使用吗?是:因为我们会得到所有0都有相邻的1
01
01001001001
我们可以使用吗?是:因为我们会得到,这里所有0都有相邻的1
10
01001001010
我们应该检查11吗?否,因为我们已经可以使用或添加一个,而添加两个,因此结果不会包含最少量的 .01
10
1
11
1
1
我将把使用这种方法编写代码留给你。
TA贡献1824条经验 获得超6个赞
我发现@Pshemo的答案优雅而直接。使用他的方法,您甚至不需要计算要替换的 最小计数。尽管如此,我还有另一种方法可能会有所帮助:1
public static void main( String[] args ) {
String [] words ={"00","000","0000","00000","000000","0000000","00000000","000000000","0000000000"} ;
for (String str :words) {
System.out.println(transform(str));
}
}
private static String transform( String word ) {
int min = getMinNumber(word);
StringBuilder sb = new StringBuilder(word);
//starting from char at index 1 replace each third '0' with '1'
//and substract 1 for each replaced char from min
for(int i = 1; i< word.length(); i = i+3){
sb.setCharAt(i, '1');
min--;
}
//if minimum replacement count not yet met replace last char
if(min >0){
sb.setCharAt(word.length()-1, '1');
}
return sb.toString();
}
public static int getMinNumber(String word) {
//just replaced your logic to make it shorter; you can keep your own implementation
return (int) Math.ceil(word.length() / 3.);
}
添加回答
举报