Ques)有一个二进制格式的输入字符串,11100并且需要计算步骤数,其中步骤号为零。如果数字是odd -> subtract it by 1,if 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是一个瓶颈,但未能为此找到更好的解决方案。有人可以向我指出此代码的瓶颈吗,可以在哪些方面进行显着改进?
需要减去的次数是1的位数Integer.bitCount()。您需要除以的次数是最高有效位的位置,即Integer.SIZE(32,整数的总位数)Integer.numberOfLeadingZeros()减去一(无需除法1)。我假设对于零输入,结果应为零。所以我们有
int numberOfOperations = integer == 0 ? 0 : Integer.bitCount(integer) + Integer.SIZE - Integer.numberOfLeadingZeros(integer) - 1;
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。