2016-06-27 15 views
1

私はこの配列を逆にしようとしていますが、配列の最後の半分を前半にすることから始めます。私の出力が9を配列[0]に入れるのをスキップする理由はありますか?私はarray [0] = tem [9-0-1]だからarray [0] = temp [8]ですか?これは本当ですか?元の配列を元に戻す

def sameArray(array) 
    temp = array 
    for i in array[0]..(((array.length)/2).floor) 
     array[i] = temp[array.length - i - 1] 
     ##puts array[i] 
    end 
end 

sameArray([1,2,3,4,5,6,7,8,9]) 

# array[0] => array[8] 
#array[1] => array[7] 
#array[2] => array[6] 
#array[3] => array[5] 
+0

0から始まるi'つのインデックスを '持つことである配列を逆に.floor = 4' –

+0

一つ巧妙かつ効率的な方法 '(9/2)ので、第二' j'は終わりから始まります配列。次に 'while(i

+0

Hmm。これをどうやって修正するのですか? –

答えて

2
def sameArray(array) 
    len = array.size 
    i = 0 
    j = len - 1 
    while i < j do 
     temp = array[i] 
     array[i] = array[j] 
     array[j] = temp 
     i = i+1 
     j = j-1 
    end 
end 

あなたはただ一つの方法でこれを解決することができ、より簡単な方法で

def sameArray(array) 
    array.reverse 
end 
+0

これは回避策ですが、OPの質問 – Li357

+0

@AndrewLへの回答ではありません。私は知っていますが、それは彼がしていることよりも簡単です。 – Shravan40

+0

本当ですが、OPはなぜ彼の逆アルゴリズムが問題を解決する他の方法ではなく動作していないのかを質問します – Li357

0

これを行うことができます、あなたの方法によるとArray#reverse!

def sameArray(array) 
    array.reverse! 
end 

array = [1,2,3,4] 
sameArray(array) 
array 
#=> [4,3,2,1] 
+0

['reverse!'](http://ruby-doc.org/core-2.2.0/Array.html#method-i-verse21)を使わないのはなぜですか? –

+0

@WandMaker:あなたは正しいですが、何らかの理由で私の文書に表示されませんでした。 – spickermann

0

コードの動作を次のとおりです。

def sameArray(array) 
    temp = array 
    for i in 0...array.length/2 
    t = array[i] 
    array[i] = temp[array.length - i - 1] 
    temp[array.length - i - 1] = t 
    ##puts array[i] 
    end 

end 

sameArray([1,2,3,4,5,6,7,8,9]) 
+0

ありがとう私はこれを得た! –

+0

@CarySwovelandはい、あなたは正しいです。ありがとう。 – kenshinji

3

は、プログラム内のいくつかの問題があります

  1. あなたが本当にあなたの方法を更新し、配列を返しません
  2. 指数iと、したがって、配列が完全な逆になっていませんarray.length - i - 1から値を交換していません、その代わりに範囲[1..4]であるforループの結果を返します。
  3. forループは、範囲内の最初の値としてarray[0]を間違って使用していますが、ちょうど0である必要があります。
  4. tempは実際にはarrayのコピーではなく、arrayの別の参照であるため、tempを使用して変更が行われた場合はarrayに変更されます。 -1インデックスは配列の最後の要素を表すようtemp.length - i - 1は同様に、-i-1ように書くことができること

    def sameArray(array) 
        temp = array.dup 
        for i in 0..(((temp.length)/2).floor) 
         temp[i], temp[-i-1] = temp[-i-1], temp[i] 
        end 
        return temp 
    end 
    

    注:上記の観察に基づいて

は、ここで更新する方法です。いくつかの慣用的なルビーを使用することにより


、我々は一時的な変数tempを取り除くともforループの代わりにeachを使用することができます。より慣れ親しんだRubyと考えることができるコードの1つのバージョンです。

def reverse(array) 
    array.dup.tap do |a| 
    (0..a.length/2).each do |i| 
     a[i], a[-i-1] = a[-i-1], a[i] 
    end 
    end 
end 
+1

ワンドは[並列割当](https://www.safaribooksonline.com/library/view/the-ruby-programming/9780596516178/ch04s05.html)(時々* multiple assignment *と呼ばれる)を使用しています。 –

関連する問題