C / C ++访谈:代码优化

时间:2013-09-04 16:08:05

标签: optimization fizzbuzz

我今天接受了采访。这个问题是为了优化下面的代码。如果我们在for循环之后会看到下面的代码,那么接下来是“if-else”的四个步骤。所以,面试官问我把它优化到3 if-else线。我已经尝试了很多。但无法找到解决方案。即使他告诉我,如果你知道脚本语言,你也可以使用它们。 请帮我优化一下。

int main()
{
    int i = 1;
    for(i; i <= 100; i++)
    {
        if((i % 3 == 0 && i % 5 == 0))
        {cout << "PR\n";}
        else if(i % 3 == 0)
        {cout << "P\n";}
        else if(i % 5 == 0)
        {cout << "R\n";}
        else
        {cout << i <<"\n";}
    }
system("pause");
return 0;
}

5 个答案:

答案 0 :(得分:4)

这是一个众所周知的问题......“FizzBuzz”。

你甚至可以在没有任何明确的IF的情况下解决它

const char *messages[] = {"%i\n", "P\n", "R\n", "PR\n"};

for (i=1; i<=100; i++) {
    printf(messages[((i % 3)==0) + 2*((i % 5)==0))], i);
}

答案 1 :(得分:2)

这是Python中的一种方式:

for i in range(1, 101):
    s = ''
    if i % 3 == 0:
        s += 'P'
    if i % 5 == 0:
        s += 'R'
    if i % 3 != 0 and i % 5 != 0:
        s = i
    print(s)

等效:使用标志,如您自己的答案所示:

for i in range(1, 101):
    s, flag = '', False
    if i % 3 == 0:
        flag = True
        s += 'P'
    if i % 5 == 0:
        flag = True
        s += 'R'
    if not flag:
        s = i
    print(s)

只是为了好玩,@ 6502的答案的Python版本:

messages = ['{}', 'P', 'R', 'PR']
for i in range(1, 101):
    print(messages[(i%3 == 0) + 2*(i%5 == 0)].format(i))

最后,我最喜欢的(因为它是最短的) - 使用最大公约数函数和查找表:

from fractions import gcd
messages = {3:'P', 5:'R', 15:'PR'}
for i in range(1, 101):
    print(messages.get(gcd(i, 15), i))

答案 2 :(得分:2)

我找到了解决方案。 请告诉我它是否好?

int main()
{
    int i = 1;int stat=0;
    for(i; i <= 100; i++)
    {
        stat=0;
        if(i%3 == 0){stat++; cout << "P";}
        if(i%5 == 0){stat++; cout << "R";}
        if(stat == 0)cout << i;
        cout << "\n";
    }
system("pause");
return 0;
}

答案 3 :(得分:0)

这种方式只使用3 if

#include <iostream>
using namespace std;

int main()
{
 for (int i = 0; i <= 100; ++i)
 {
   bool fizz = (i % 3) == 0;
   bool buzz = (i % 5) == 0;
   if (fizz)
    cout << "Fizz";
   if (buzz)
    cout << "Buzz";
    if (!fizz && !buzz)
     cout << i;
    cout << endl;
  }
  return 0;
}

答案 4 :(得分:0)

我真的很喜欢6502的答案,但这是一个没有额外变量的简单解决方案:

for(i = 1; i <= 100; i++)
{
    if(i % 3 != 0 && i % 5 != 0)
    {
        printf("%d\n", i);
        continue;
    }

    if(i % 3 == 0)
        printf("P");

    if(i % 5 == 0)
        printf("R");

    printf("\n");
}