2016-08-30 2 views
0

Так я был вопрос интервью: Написать функцию, которая принимает число и возвращает все числа меньше или делится на 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; 
     } 

до сих пор так хорошо. Следующий вопрос был: предположим, что звонок делался 10 тысяч раз в час. Как вы могли ускорить его?

Я сказал, что если бы вы знали, что ваша очередь, вы можете разбить свою очередь и наполнить ее. Это вызвало некоторые моменты, которые я чувствую. Однако он хотел знать, есть ли что-нибудь в функции, которую я мог бы сделать.

Я придумал, чтобы проверить, было ли число больше 7. Если это так, инициализируйте список с 1 - 7 и запустите цикл int i = 8, который, я думаю, был в порядке, но есть ли другой способ, который мне не хватает ?

+0

Всегда 7? Загрузите список. – Nikki9696

+0

Вы пытаетесь найти значения или индексы, которые «под/делится на 7»? Вопрос состоит в том, что кажется, что они хотят значений, но ваш пример возвращает индексы. – Corylulu

+0

Я был бы ценным. num - это число. i все числа меньше или равны числу, которое вы отправляете – Muckeypuck

ответ

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; 
     } 
+0

good call sir. – Muckeypuck

1

Вы можете кэшировать результаты. Каждый раз, когда вы вызываете свою функцию, проверьте, какие числа находятся в кеше, и вычислите остальную.

Если текущее число меньше, верните соответствующие результаты кэширования.

+1

И как бы выглядел ваш кеш-просмотр? Я уверен, что поиск в кэше будет дороже, чем пересчет. – sstan

+1

Поиск хэшмапа намного быстрее, чем цикл calc, я считаю, – Nikki9696

+0

Мне нравится эта идея но это может быть дорогостоящее воспоминание – Muckeypuck

0

Интервью, как правило, больше о том, как вы относитесь к проблемам в целом и не столько к технической реализации. В вашем случае вы можете сделать много мелочей, например, кэширование списка на улице. Кэширование различных версий списка в словаре, если пространство не было проблемой. Может быть, кто-то может придумать какую-то более умную математику, чтобы сэкономить на вычислениях, но обычно это вопрос о правильных вопросах и рассмотрении правильных вариантов. Скажем, если вы спросите: «Эта программа запускается на веб-сервере? Возможно, я могу хранить все данные в таблице и использовать ее в качестве быстрого поиска, а не перерасчета каждый раз». Возможно, даже не будет правильного или лучшего ответа, они, вероятно, просто хотят услышать, что вы можете придумать особые ситуации.

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 
     } 
} 
+0

это хорошая идея, но что, если отправленные номера были 7 25 6? не было гарантий, что числа были увеличены с ошибкой в ​​последних точных – Muckeypuck

+0

, вот почему есть условие else, которое имеет дело с число меньше наибольшее число до сих пор –

+0

о, я вижу, что вы это говорили. hmm Maybe – Muckeypuck

0

Вы можете найти все числа, которые делятся на 7 и меньше, чем NUM путем вычисления Реза = Num/7, а затем создать цикл от 1 до Реза и умножить каждое число на 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; 
}