计算数字中连续零的数量,不使用循环

时间:2013-12-28 01:52:47

标签: algorithm language-agnostic

我发现这是一个面试问题。虽然使用位掩码和循环来解决它是相当简单的,但是如何在没有循环的情况下完成这个任何想法?虽然我正在寻找一种算法,但任何代码都会受到赞赏。

2 个答案:

答案 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;
}