这是我在竞争性编程中遇到的问题之一。
问题)您有一个二进制格式的输入字符串11100
,您需要计算数字为零的步骤数。如果数字是odd -> subtract it by 1
,如果even -> divide it by 2
。
例如
28 -> 28/2
14 -> 14/2
7 -> 7-1
6 -> 6/2
3 -> 3-1
2 -> 2/2
1-> 1-1
0 -> 停止
步数=7
我想出了以下解决方案
public int solution(String S) {
// write your code in Java SE 8
String parsableString = cleanString(S);
int integer = Integer.parseInt(S, 2);
return stepCounter(integer);
}
private static String cleanString(String S){
int i = 0;
while (i < S.length() && S.charAt(i) == '0')
i++;
StringBuffer sb = new StringBuffer(S);
sb.replace(0,i,"");
return sb.toString();
}
private static int stepCounter(int integer) {
int counter = 0;
while (integer > 0) {
if (integer == 0)
break;
else {
counter++;
if (integer % 2 == 0)
integer = integer / 2;
else
integer--;
}
}
return counter;
}
这个问题的解决方案看起来非常简单明了,但是这段代码的性能评估给了我一个大零。我最初的印象是,将字符串转换为 int 是一个瓶颈,但未能找到更好的解决方案。有人可以向我指出这段代码的瓶颈以及可以显着改进的地方吗?
慕标琳琳
拉风的咖菲猫
Cats萌萌
相关分类