我正在处理来自 Facebook Software Engineer
的面试问题问题:编写一个函数,给出两个二进制数字作为字符串返回二进制数的总和
这是我在Java中的解决方案(经测试,它可以工作!!!)
private static String sum(String bin1, String bin2)
{
int dec1 = binToDec(bin1);
int dec2 = binToDec(bin2);
int sumTo = dec1 + dec2;
StringBuilder bin = new StringBuilder();
do {
bin.append(sumTo%2);
sumTo = sumTo/2;
}while(sumTo > 0);
return bin.reverse().toString();
}
private static int binToDec(String bin)
{
int result = 0;
int len = bin.length();
for(int rep = len-1; rep >= 0; rep--) {
int multiplyBy = bin.charAt(rep) == '1' ? 1 : 0;
result += multiplyBy * Math.pow(2, len-1-rep);
}
return result;
}
我试图分析总和的时间和空间复杂性。我知道由于二进制转换,算法的时间复杂度只是 O(logn)。
像往常一样,我在空间复杂性方面遇到了困难。我知道空间复杂度只取决于我从堆中分配的内存,在这种情况下是表示二进制和结果的字符串我知道字符串连接是一项昂贵的操作,因为它需要复制1个字符,然后复制2个字符,然后最后登录字符。我知道传统的字符串连接在O(n 2 )空间中运行。这会是一样的吗?
我自己尝试进行计算
1 + 2 + 3 +.... logn-1 + logn <BR>
logn + logn-1 + ....1<BR>
logn(logn + 1)/2
得到 logn(logn + 1) / 2 的最终结果 这将是 O((logn) 2 )。这个算法的空间复杂度是否合适?或者它只是 O(n 2 ),因为这两个函数属于同一个族?
答案 0 :(得分:0)
在重新审视这个问题后,我应该更清楚地使用变量。
我算法的时间复杂度为 O(log 2 m + n 1 + n 2 ) Big O Summation其中 m 是二进制数之和的十进制表示。 n 1 和 n 2 分别是位数,或bin1和bin2的长度。
对于Space Complexity,您必须考虑算法分配的所有内存 - 从堆栈和堆中。
在分析我在stack中使用的空间量时,我注意到我没有进行递归调用,该空间将是 O(1)。类似地,当分析我在堆中使用的空间量时,它也将是 O(1),因为无论输入如何,我总是分配相同的空间量(3个int),使用没有数据结构。
因此,我的解决方案的空间复杂性是 O(1)