Question: I'm working on an iOS app, that should work fine with both iphones and ipads.
As I know we can build the app as universal or convert iphone storyboard into ipad storyboard.What I want to know is, what is the best way from these and, when we launch app to app store, is it a problem to have two storyboards one for iphone and another for ipad.

Answer: 
The approach presented by John Coleman is what the interviewer was hoping for, in all probability.  

If you are willing to go quite a bit more complicated, you can increase expected skip length:  

Call the target value *k*. Start with the first element's value *v* at position *p* and call the difference k-v *dv* with absolute value *av*. To speed negative searches, have a peek at the last element as the other value *u* at position *o*: if dv×du is negative, k is present (if any occurrence of k is acceptable, you may narrow down the index range here the way binary search does). If av+au is greater than the length of the array, k is absent. (If dv×du is zero, v or u equals k.)  

Omitting index validity: Probe the ("next") position where the sequence might return to v with k in the middle: `o = p + 2*av`.  

If dv×du is negative, find k (recursively?) from p+av to o-au;  

if it is zero, u equals k at o.  

If du equals dv and the value in the middle isn't k, or au exceeds av,  

or you *fail* to find k from p+av to o-au,  

let `p=o; dv=du; av=au;` and keep probing.  

(For a full flash-back to '60ies texts, view with Courier. My "1st 2nd thought" was to use `o = p + 2*av - 1`, which precludes *du equals dv*.)
Here is a divide-and-conquer style solution. At the expense of (much) more bookkeeping, we can skip more elements; rather than scanning left-to-right, test in the middle and skip in *both* directions. 

```
#include <stdio.h>                                                               
#include <math.h>                                                                

int could_contain(int k, int left, int right, int width);                        
int find(int k, int array[], int lower, int upper);   

int main(void){                                                                  
    int a[] = {4,3,2,3,2,3,4,5,4,5,6,7,8,7,8};                                   
    printf("7 first occurs at index %d\n",find(7,a,0,14));                       
    printf("but 9 first \"occurs\" at index %d\n",find(9,a,0,14));               
    return 0;                                                                    
}                                                                                

int could_contain(int k, int left, int right, int width){                        
  return (width >= 0) &&                                                         
         (left <= k && k <= right) ||                                            
         (right <= k && k <= left) ||                                            
         (abs(k - left) + abs(k - right) < width);                               
}                                                                                

int find(int k, int array[], int lower, int upper){                              
  //printf("%d\t%d\n", lower, upper);                                            

  if( !could_contain(k, array[lower], array[upper], upper - lower )) return -1;  

  int mid = (upper + lower) / 2;                                                 

  if(array[mid] == k) return mid;                                                

  lower = find(k, array, lower + abs(k - array[lower]), mid - abs(k - array[mid]));
  if(lower >= 0 ) return lower;                                                    

  upper = find(k, array, mid + abs(k - array[mid]), upper - abs(k - array[upper]));
  if(upper >= 0 ) return upper;                                                  

  return -1;                                                                     

}

```