3

我今天接受了采访。这个问题是为了优化下面的代码。如果我们将在 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;
}
4

5 回答 5

4

这是一个众所周知的问题……“ FizzBu​​zz ”。

您甚至可以在没有任何显式 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);
}
于 2013-09-04T16:14:01.123 回答
3

这是一种方法,在 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))
于 2013-09-04T16:25:26.373 回答
2

I found a solution. Please let me know whether it is good or not?

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;
}
于 2013-09-04T16:29:30.790 回答
1

我真的很喜欢 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");
}
于 2015-11-23T05:01:42.467 回答
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;
}
于 2014-10-07T07:39:19.393 回答