所以我有一个面试问题:写一个带数字的函数,返回所有小于或可被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我认为没问题但是我还有另一种方法吗?
答案 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#程序员应该至少对上述所有知识有所了解,并且内存管理通常是一个隐藏的问题。