2017-02-25 47 views
0

通過CodeFights工作。這是在第5級https://codefights.com/arcade/intro/level-5/XC9Q2DhRRKQrfLhb5問題4:當所有的跳躍長度相同並且某些位置不能落地時,我可以在整個範圍內移動的最小跳躍是多少?

您給出較位於一條直線上 障礙座標整數數組。

假設您從座標0的點跳到右邊的 。您只允許跳轉長度相同的長度爲 的某個整數。

找到足夠的最小長度以避免所有障礙。

對於inputArray = [5,3,6,7,9],輸出應該是 avoidObstacles(inputArray)= 4。

退房下面爲了更好地理解圖像:

enter image description here

輸入/輸出

[時限] 4000ms(RB)[輸入] array.integer INP utArray

非空數組的正整數。

限制條件:2≤inputArray.length≤10,1≤inputArray [I]≤40.

[輸出]整數

的期望的長度。

發生這種情況的自然方法似乎是一步一步。這裏是我的代碼:

def avoidObstacles(arr) 
    jumps = (arr.min..arr.max+1).reject{|n| arr.include?(n)} 
    full_map = (0..arr.max+1) 
    jumps.each do |j| 
    return j if full_map.step(j).none?{|n|arr.include?(n)} 
    end 
end 

我通過您的網站上提供的可視測試:

輸入:inputArray:

def avoidObstacles(arr) 
    jumps = (arr.min..arr.max+1).to_a - arr 
    full_map = (0..arr.max+1) 
    jumps.each do |j| 
    return j if (full_map.step(j).to_a & arr).empty? 
    end 
end 

寫這更明確的方式[5 ,3,6,7,9]預期輸出:4

輸入:inputArray:[2,3]預期輸出:4

輸入:inputArray:[1,4,10,6,2]預期輸出:7

但我得到的隱藏測試之一絆倒。我借用了其他用戶的解決方案,這在所有情況下工作:

def avoidObstacles a 
    obs = a.each_with_object(Hash.new(false)){|v, h| h[v]=true} 
    m = a.max 
    (1..m+1).each do |j| 
     return j if (0...m/j+1).all?{ |i| obs[i*j] == false } 
    end 
    m 
end 

我不太肯定這借來的解決方案成功和失敗礦。

非常感謝您的幫助。我對編碼還很陌生,非常感謝你的時間。

+0

不太清楚我按照你的邏輯。如果我理解正確的是,返回的項目應該是一個足夠大的數字,它比每個項目之間的差異更大。假設這是正確的,爲什麼第二個答案是4 ...不應該是2.第一個和第三個似乎是按照我所說的,但第二個我失去了,如果它實際上是4.而你的範圍 - 數組邏輯也讓我感到困惑。 – grail

+0

我添加了一個圖像來澄清。(範圍數組)陣列的燼將不會是一個合適的步驟間隔。我通過從範圍中減去數組來避免這些無意義的步驟方法測試。 – MattF

+0

我想到了一種不使用數組減法和聯合來編寫代碼的方法,並且將其包含在編輯中。 – MattF

回答

1
avoidObstacles [3,5,7] #=> 4 

但它應該是2。你想

def avoid_obstacles(arr) 
    return nil if arr.empty? or arr.max == 1 
    jumps = (2..arr.max+1).to_a - arr 
    full_map = (0..arr.max+1) 
    jumps.each do |j| 
    return j if (full_map.step(j).to_a & arr).empty? 
    end 
end 

avoid_obstacles [3,5,7] 
    #=> 2 

我改變了方法的名稱,因爲Ruby的約定是使用snake-case的方法和變量名。

另一個人的解決方案工作,因爲它開始搜索j = 1。 (這可能在j=2已經開始,因爲j = 1總是會失敗。

+0

所以我的主要問題是假設只有一個大於arr參數中最小值的值才能工作。謝謝。 – MattF

0

我利用給定的輸入限制(所以沒有使用輸入驗證)嘗試這種在Java中

int avoidObstacles(int[] inputArray) { 
    Arrays.sort(inputArray); 

    //start from 2 because jump length 1 will always fail 
     int minJump=2 ; 

     while(validateJumpValue(inputArray, minJump)){ 
      minJump++;   
     } 

     return minJump; 

    } //check if all the successive jumps can avoid touching obstacles boolean validateJumpValue(int[] arr, int jump){   int successiveJump=jump;  while(Arrays.binarySearch(arr, successiveJump)<0 && successiveJump <= arr[arr.length-1]) {   successiveJump+=jump;  }  return successiveJump<=arr[arr.length-1]; }