我发现这是一个面试问题。虽然使用位掩码和循环来解决它是相当简单的,但是如何在没有循环的情况下完成这个任何想法?虽然我正在寻找一种算法,但任何代码都会受到赞赏。
答案 0 :(得分:0)
我不知道这是否是他们想要的,但这是一个递归的解决方案。
我使用了两个递归,一个将当前的零字符串与记录进行比较,另一个递归计算当前的零字符串。
public class countconsecutivezeros{
public static void main(String[] Args){
int number = 40040001; // whatever the number is
System.out.println(consecutivezeros(number, 0));
}
public static int consecutivezeros(int number, int max){
if (number != 0){
if (max < zerosfrompoint(number)) max = zerosfrompoint(number);
return consecutivezeros(number/10, max);
}
return max;
}
public static int zerosfrompoint(int number){
int zeros = 0;
if ((number != 0) && ((number/10)*10 == number)){
zeros++;
System.out.println(zeros);
return zeros + zerosfrompoint(number/10);
}
return zeros;
}
}
答案 1 :(得分:0)
我看到的解决问题没有循环的选项是位攻击,递归和循环展开。
解决这个问题看起来很困难 - 最有可能只有最熟练的黑客能够在面试的时间限制内弄清楚,或者真正弄清楚,但有可能是他们是谁寻找。
循环展开只是一个愚蠢的解决方案。
这样就离开了递归。
下面是Java中的递归解决方案。
它基本上保持连续零的当前计数以及最佳计数,检查最后一位数(即检查数字模10),适当地设置这些值并在没有最后一位数的情况下递归(即除以10)
我假设我们在数字的十进制表示中讨论零,但是将其转换为使用二进制表示是微不足道的(只需将10
更改为2
)。
public static int countMaxConsecutiveZeros(int number)
{
return countMaxConsecutiveZeros(number, 0, 0);
}
private static int countMaxConsecutiveZeros(int number, int currentCount, int bestCount)
{
if (number == 0)
return bestCount;
if (number % 10 == 0)
currentCount++;
else
{
bestCount = Math.max(bestCount, currentCount);
currentCount = 0;
}
return countMaxConsecutiveZeros(number / 10, currentCount, bestCount);
}
public static void main(String[] args)
{
System.out.println(countMaxConsecutiveZeros(40040001)); // prints 3
}
这是一个大致相当的基于循环的解决方案,应该可以更好地理解递归解决方案:
private static int countMaxConsecutiveZerosWithLoop(int number)
{
int currentCount = 0, bestCount = 0;
while (number > 0)
{
if (number % 10 == 0)
currentCount++;
else
{
bestCount = Math.max(bestCount, currentCount);
currentCount = 0;
}
number /= 10;
}
return bestCount;
}