2016-05-05 6 views
-2

配列番号arrayがあります。 注文番号の配列に要素がありません。

  • earrayの要素ではない、と
  • eev + 1v - 1のいずれかである、arrayのいくつかの要素vについて

    • :私はarrayからが欠落する番号eを定義した場合0より小さくない。たとえば、

    から欠落している要素:

    array = [0, 1, 2, 4, 5, 6, 9, 10, 12, 13, 17] 
    

    は以下のとおりです。

    [3, 7, 8, 11, 14, 16, 18] 
    

    にはどうすればいいの要素が指定された配列arrayから欠落して見つけることができますか?

  • 答えて

    3

    それはあなたが何かしたいのようになります。

    array = [0, 1, 2, 4, 5, 6, 9, 10, 12, 13, 17] 
    possible_missing = array.flat_map {|e| [e-1, e+1]}.uniq 
    #=> [1, 0, 2, 3, 5, 4, 6, 7, 8, 10, 9, 11, 13, 12, 14, 16, 18] 
    diff = (possible_missing - array).select {|e| e >= 0} 
    #=> [3, 7, 8, 11, 14, 16, 18] 
    
    +0

    は '使用することを検討してください。また、 '[e-1、e + 1]'は 'flat_map'の内部に十分です。 – mudasobwa

    +0

    @ mudasobwa、私は '[e-1、e + 1]'を持っています。代わりにindexについて - 配列の最初の要素が '0'でない場合はどうなりますか? – Ilya

    +0

    すみません。結果の配列に現れる余分な要素は '-1'だけです。つまり、 ' - [-1]'と 'select {| e | e> = 0} 'は完全に等価です:' arr.flat_map {| e | (e-1..e + 1).to_a} .uniq-arr - [-1] 'となる。 – mudasobwa

    1

    これを行うための最も効率的な方法は、おそらくinject.となります。これは、あなたが1回だけで、新しいアレイを構築することができます。あなたはアルゴリズムを書く必要があるので、特にルビー色ではありません。関数のビルドに頼る代わりに。しかし、おそらくそれを行う最も効率的な方法です。

    次のアルゴリズムは、返される配列の最終値がn + 1で、各反復を終了します.nは評価された最後の項目です。次のアイテムがそのアイテムを除外する場合は、そのアイテムをn + 1に置き換えます。次の項目が前の項目よりも2より大きい場合、n-1も挿入されます。 [-1] ``の代わりに重いO(N)の ``> = 0 'を選択 -

    present = [0, 1, 2, 4, 5, 6, 9, 10, 12, 13, 17] 
    
    present.inject([]) {|absent,n| 
        # If a number has been skipped at n -1 and n +1 
        if (absent.empty? or absent.last < n - 1) && n > 0 
         absent << n -1 << n + 1 
    
        # if n-1 is already present or the new array is still empty, add n+1 
        elsif absent.empty? or absent.last == n-1 
         absent << n + 1 
    
        # if the last element of the absent list should be excluded because it is n, replace it with n+1 
        elsif absent.last == n 
         # replace last absent with next 
         absent[absent.length-1] = n + 1 
         absent 
    
        # in all other cases do nothing 
        else absent 
        end 
    } 
    
    # => [3, 7, 8, 11, 14, 16, 18] 
    
    0
    array = [0, 1, 2, 4, 5, 6, 9, 10, 12, 13, 17] 
    range = (0..(array.max + 1)) 
    (range.to_a - array).select do |el| 
        [el-1, el+1].any?{|el2| array.include?(el2)} 
    end 
    # => [3, 7, 8, 11, 14, 16, 18] 
    
    1
    arr = [0, 1, 2, 4, 5, 6, 9, 10, 12, 13, 17] 
    
    b = ([arr[0]-1,0].max..arr[-1]+1).to_a - arr 
        #=> [3, 7, 8, 11, 14, 15, 16, 18] 
    (b - b.each_cons(3).with_object([]) { |(c,d,e),f| f << d if e==c+2 }) 
        #=> [3, 7, 8, 11, 14, 16, 18] 
    
    関連する問題