Найти высоты между расстояниями пешеходной тропы - PullRequest
0 голосов
/ 01 мая 2011

У нас есть массив высот, представляющих высоту вдоль пешеходного маршрута. С учетом индексов start / end в массиве вернуть сумму изменений для обхода, начиная с индекса start и заканчивая индексом end. Например, с высотами {5, 3, 6, 7, 2} и start=2, end=4 дает сумму 1 + 5 = 6. И начальный, и конечный индексы будут действительными индексами в массиве с start <= end.

sumHeights({5, 3, 6, 7, 2}, 2, 4) => 6       
sumHeights({5, 3, 6, 7, 2}, 0, 1) => 2       
sumHeights({5, 3, 6, 7, 2}, 0, 4) => 11    

Я изо всех сил пытаюсь понять это правильно, я попробовал часть этого, но я запутался, и я получаю ArrayIndexOutOfBoundsException.

 public int sumHeights(int[] heights, int start, int end) {        

   int total =0;   
   int difference =0;   
      for(int i=start;i<=end;i++){           
        if(heights[i] > heights[i++]){         
           difference =heights[i] - heights[i++];                  
        }else if(heights[i++] > heights[i]){         
           difference =heights[i++] - heights[i];            
        }   
        total+=difference;   
      }   
   return total;   
 }  

Ответы [ 3 ]

2 голосов
/ 01 мая 2011

Вы увеличиваете i в своем цикле, таким образом, возможно выходя за пределы:

for(int i=start;i<=end;i++){      // here i might be last valid index, i.e. 4 in your example     
    if(heights[i] > heights[i++]){    //here i might be 5 (because of i++), i.e. you'd get the ArrayIndexOutOfBoundsException     
       difference =heights[i] - heights[i++]; //here i might be 6 (because of another i++), i.e. you'd get the ArrayIndexOutOfBoundsException                 
    }else if(heights[i++] > heights[i]){     //here i might be 5, i.e. you'd get the ArrayIndexOutOfBoundsException    
       difference =heights[i++] - heights[i];            
    }   
    total+=difference;   
  }   

Чтобы исправить это, используйте:

for(int i=start;i<end;i++){   
int next = i + 1;     
    if(heights[i] > heights[next]){  
       difference =heights[i] - heights[next]; //assuming you mean next = i + 1 here and not next = i + 2 like in your code               
    }else if(heights[next] > heights[i]){    
       difference =heights[next] - heights[i];            
    }   
    else {
      difference = 0; //due to public demand I'll help you with this, too
    }

    total+=difference;   
  }   

Редактировать: вы также можете сделать цикл намного проще:

for(int i=start;i<end;i++){   
  total += Math.abs(heights[i] - heights[i+1]);  
}   
1 голос
/ 01 мая 2011

Это потому, что

  • вы увеличиваете переменную i внутри цикла.Используйте i+1 вместо i++ внутри цикла.Оператор ++ не возвращает i+1, а возвращает i и присваивает i=i+1.
  • Другая проблема состоит в том, что ваш цикл for имеет неправильное определение значений i.Если вы хотите вернуть sumHeights({11, 12}, 0, 1), вы хотите запустить цикл только один раз, верно?Если вы запустите этот цикл дважды, i+1 будет равен 2 во втором запуске, и он выбросит индекс из исключенного ограничения.
  • другая проблема - когда heights[i] == heights[i+1] - в этом случае разницане пересчитывается и может быть назначено в предыдущем цикле цикла.Вы можете решить это, переместив difference объявление переменной внутри цикла.

Попробуйте этот код:

 public int sumHeights(int[] heights, int start, int end) {        

   int total =0;   
      for(int i=start;i<end;i++){           
        int difference =0;   
        if(heights[i] > heights[i+1]){         
           difference =heights[i] - heights[i+1];          
        }else if(heights[i+1] > heights[i]){         
           difference =heights[i+1] - heights[i];            
        }   
        total+=difference;   
      }   
   return total;   
 }
0 голосов
/ 26 октября 2016

Я сделал это так:

 public int sumHeights(int[] heights, int start, int end) {
 int sum=0;
while(start<end)
 {
   sum+=Math.abs(heights[start+1]-heights[start]);
   start++;
 }
return sum;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...