2017-01-15 4 views
0

Я ищу алгоритм для определения, есть ли в массиве как минимум три последовательных числа. Я нашел несколько и немного изменил их, но он, похоже, не работает. Вот что я сейчас делаю. Массив сортируется с использованием NSSortDescriptor перед циклом.Поиск последовательных целых чисел в массиве

Например:
в массиве [5,6,101,102,103] три последовательных числа [101102103]
и ниже функция должна возвращать YES.

int c = [checkArray count]; 
int a,b = 0; 

int cnt = 1; 
for (int i = 1; i < c; i++) 
{ 
    a = [[checkArray objectAtIndex:i] intValue]; 
    b = [[checkArray objectAtIndex:i-1] intValue] - 1; 

    if (a == b) 
    { 
     cnt++; 
     if (cnt == 3) 
      return YES; 
    } else { 
     cnt = 1; 
    } 
}  
return NO; 

ответ

1

Вы должны быть в состоянии сделать что-то вроде ...

for (int i = 1; i < checkArray.count-1; i++) 
{ 
    int lower = [checkArray[i-1] intValue] +1; 
    int mid = [checkArray[i] intValue]; 
    int upper = [checkArray[i+1] intValue] -1; 

    if (lower == mid && mid == upper) { 
     return YES; 
    } 
}  
return NO; 

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

+0

Это работает как шарм. Благодаря! –

2

Это альтернативный подход. Я не тестировал его, но вы должны получить эту идею.

int c = [checkArray count]; 
int a,b,c = 0; 

a = [[checkArray objectAtIndex:0] intValue]; 
b = [[checkArray objectAtIndex:1] intValue]; 
for (int i = 2; i < c; i++) 
{ 
    c = [[checkArray objectAtIndex:i] intValue];  
    if (a+2 == b+1 && b+1 == c) 
     return YES; 
    a = b; 
    b = c; 
}  
return NO; 

У этого есть дополнительное преимущество в том, чтобы быть легко оптимизированным.

+0

'c' - это счетчик и третье значение. – Willeke

+0

Это прекрасно работает. Благодарю. –

Смежные вопросы