【发布时间】:2016-09-13 19:58:27
【问题描述】:
您好,我正在解决一个问题:
给定一个以 10 为底的整数 n,将其转换为二进制(以 2 为底)。然后找到并 打印以 10 为底的整数,表示连续 1 的最大数量 在 n 的二进制表示中。例如对于 n=5,base-2 = 101 所以输出应该是 1,对于 n = 439,base-2 = 110110111 所以输出应该是 3。
下面是我的代码解决方案:
class Solution {
static int CalcBinary (int n) {
Stack<int> binRep = new Stack<int>();
while (n > 0) {
int i = n%2;
binRep.Push (i);
n = n/2;
}
int oldCount = 0, newCount = 0;
while (binRep.Count > 0){
int val = binRep.Pop();
if (val == 1) {
newCount++;
} else {
if (newCount > oldCount) {
oldCount = newCount;
}
newCount = 0;
}
}
return (newCount > oldCount) ? newCount : oldCount;
}
static void Main(String[] args) {
int n = Convert.ToInt32(Console.ReadLine());
Console.WriteLine (CalcBinary(n));
}
}
代码运行良好,并通过了所有测试用例,例如 n = 5、6、439 等。我唯一的问题是,是否有任何优化的解决方案可以做到这一点。其他人发布了相同的问题here,但对该问题的所有回复似乎都与 O(n) 时间复杂度相同。另一件事是我可以使用数组而不是堆栈,但这有什么不同吗??
【问题讨论】:
-
437 (
110110101) 的答案是什么? 2? -
我认为计算一个数字中的 1 位(即 O(1 的数量))可能适用于这种情况,以获得比固定长度数字的 O(位数)更好... (只是猜测,不完全确定会不会成功)
-
我很确定您的意思是
O(log n),除非n是二进制位数而不是数字本身。 -
有什么理由需要使用堆栈或数组 - 您可以直接处理整数值吗? while (n > 0) { if ((n%2) == 1) .......
-
@UweKeim,在此之前我遇到过问题,虽然我的问题在 stackoverflow 上有效,但在代码审查中却是负面的。所以我更愿意在这里问他们。
标签: c# arrays algorithm loops stack