所有数字小于或可被七

时间:2016-08-30 19:32:17

标签: c#

所以我有一个面试问题:写一个带数字的函数,返回所有小于或可被7整除的数字

    private List<int> GetLessThanOrDivisbleBySeven(int num)
    {
       List<int> ReturnList = new List<int>();

       for(int i = 0; i <= num; i++)
       {
           if(i <7 || i % 7 == 0)
           {
              ReturnList.Add(i);
            }
         }

         return ReturnList;
      }

到目前为止一切顺利。后续问题是:让我们说每小时拨打电话的次数是成千上万次。你怎么能加快速度呢?

我说如果你知道你的队列是什么,你可以分解你的队列并将其线程化。这让我觉得有点意思。但是,他想知道我能做什么功能。

我想出了测试num是否大于7的想法。如果是这样用1 - 7初始化列表并启动循环int i = 8我认为没问题但是我还有另一种方法吗?

6 个答案:

答案 0 :(得分:4)

如果你想在没有缓存的情况下加速它,你可以将i递增7以使所有可被7整除的数字,它将是这样的:

        static private List<int> GetLessThanOrDivisbleBySeven(int num) {
            List<int> ReturnList;
            int i;
            if (num <= 7) {
                ReturnList = new List<int>();
                for (i = 0; i <= num; i++) {
                    ReturnList.Add(i);
                }
                return ReturnList;
            }

            ReturnList = new List<int> { 0, 1, 2, 3, 4, 5, 6 };
            i = 7;
            while (i <= num) {
                ReturnList.Add(i);
                i += 7;
            }

            return ReturnList;
        }

答案 1 :(得分:1)

您可以缓存结果。每次调用函数时,请检查缓存中的数字,然后计算其余数字。

如果当前数字较小,则返回相应的缓存结果。

答案 2 :(得分:1)

在计算新列表时使用以前的结果

int oldMax = 0;
List<int> ReturnList = new List<int>();

private List<int> GetLessThanOrDivisbleBySeven(int num)
{
       if (num > oldMax )
       {
           oldMax  = num;
           for(int i = oldMax ; i <= num; i++)
           {
              if(i <7 || i % 7 == 0)
              {
                 ReturnList.Add(i);
               }
            }
              return ReturnList;
       }
       else 
       {
            // create a copy of ReturnList  and Remove from  the copy numbers bigger than num
       }
} 

答案 3 :(得分:0)

面试问题通常更多地是关于如何处理问题,而不是技术实施。在你的情况下,你可以做很多小事情,比如在外面缓存列表。如果空间不是问题,则在字典中缓存不同版本的列表。也许有人可以提出一些更聪明的数学,以节省计算,但通常更多的是提出正确的问题并考虑正确的选择。比方说,如果你问“这个程序是否在Web服务器上运行?也许我可以将所有数据存储在一个表中,并将其用作快速查找,而不是每次都重新计算。”甚至可能没有正确或最佳答案,他们可能只是想听,你可以想到特殊情况。

答案 4 :(得分:0)

通过计算res = num / 7,您可以找到所有可被7整除且小于num的数字,然后创建一个从1到res的循环,并将每个数乘以7。

private List<int> GetLessThanOrDivisbleBySeven(int num)
{
   List<int> ReturnList = new List<int>();
   // Add all the numbers that are less than 7 first
   int i = 0;
   for(i = 0; i < 7; i++)
      ReturnList.Add(i);

   int res = num / 7;// num = res*7+rem
   for(i = 1; i <= res; i++)
   {
       ReturnList.Add(i*7);
   }

   return ReturnList;
 }

答案 5 :(得分:0)

考虑内存管理以及List类的工作原理。

除非您告诉它所需的容量,否则它会在空间用尽时分配一个新数组,但是很容易确定所需的大小。

与使用List相比,返回数组将节省一个对象分配,因此请讨论两者之间的权衡。

使用“ yield return”避免分配内存该怎么办?还是要考虑其他成本?

是否经常请求相同的数字,如果需要的话,考虑缓存。

LINQ是否可以使用Enumerable.Range帮助?

一个有经验的C#程序员应该至少对上述所有知识有所了解,并且内存管理通常是一个隐藏的问题。