2つ以上の方法で2つの数字を交換.


この問題に遭遇しなかったプログラマはいない.

Write a program to swap two numbers.


一時変数を使用して2つの数値を交換することは一般的です.しかし、スワッピングの他の方法があります.私はいくつかの方法を列挙しています.

破壊課題


で導入される破壊課題を使用して番号を交換する前にES2015 , それを理解しましょう.
var a, b;

[a, b] = [33, 22, 11];

console.log(a, b) // 33 22
The [a, b] = [33, 22, 11] は、配列を構造化する破壊課題です[33, 22, 11] . 第1項目33は変数Aに、第2項目22は変数Bに割り当てられる.
これを知って、今交換しましょう.
let a = 12, b = 24;

[a, b] = [b, a]; // destructuring assignment

console.log(`a = ${a}, b = ${b}`); // a = 24, b = 12
破壊的割当の段階的破壊
  • 一時的な配列[b, a] 値付きで[24, 12] が生成される.
  • 破壊は起こる[a, b] = [24, 12] , 変数Aに値24を代入し、変数Bに値12を代入する.
  • 追加と差異


    このメソッドは単純な数学的論理を使って問題文を解決します.
    var a = 12, b = 24;
    
    a = a + b; // a = 36
    b = a - b; // b = 36 - 24 = 12
    a = a - b; // a = 36 - 12 = 24
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    しかし、この方法に制限があります.
  • 整数のみをスワップできます
  • の合計a = a + b 最初のステップでは、以下のNumber.MAX_SAFE_INTEGER
  • Note: You can do this swapping in one line :
    num2 = num1 + ( num1 = num2 ) - num2;
    I am using num1 and num2 for easy understanding


    乗算と除算


    この方法は再び論理的手法である.これは、以前の方法とほぼ同じですが、等級、すなわち、乗算の代わりに追加と除算の代わりに減算を使用します.
    var a = 12, b = 24;
    
    a = a * b; // a = 288
    b = a / b; // b = 288 / 24 = 12
    a = a / b; // a = 288 / 12 = 24
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    この方法の制限について議論しましょう.
  • ゼロは、乗算と除算の敵です.数の一方が0の場合、このメソッドを使用しないでください.それはNaN .
  • 避けるInfinity and -Infinity 数の一つとして.その答えは再びNaN .
  • Note: You can do this swapping in one line :
    num2 = num1 * ( num1 = num2 ) / num2;
    I am using num1 and num2 for easy understanding


    ビットOR演算子


    このメソッドを使用する前に、XOR演算子を修正しましょう.2 or入力が異なる場合、XOR演算子はtrueを返す.以下の表を示します.
    エー
    b
    A ^ B
    0
    0
    0
    0
    1
    1
    1
    0
    1
    1
    1
    0
    このロジックを使うと、2つの整数を交換することができます.値5のVAR Aと値9のVAR Bを交換するステップを以下に示す.
  • 変数AとBのバイナリ等価は以下の通りです.
    A = 5 = 0101とB = 9 = 1001
  • 値を保存するa ^ b into a .
  • a = a ^ b
    
    エー
    b
    A = A ^ B
    0
    1
    1
    1
    0
    1
    0
    0
    0
    1
    1
    0
  • 値を保存するa ^ b into b .
  • b = a ^ b
    
    エー
    b
    A = B
    1
    1
    0
    1
    0
    1
    0
    0
    0
    0
    1
    1
  • 値を保存するa ^ b into a .
  • a = a ^ b
    
    エー
    b
    A = A ^ B
    1
    0
    1
    1
    1
    0
    0
    0
    0
    0
    1
    1
  • この時点で変数Aは9であり、変数Bは5である値0101を保持する.したがって、我々は値が交換されるのを見ます.
  • var a = 12, b = 24;
    
    a = a ^ b; 
    b = a ^ b; 
    a = a ^ b; 
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    
    では、このメソッドの制限を見てみましょう.
  • 数の整数部分を取得するので、小数点数をスワップできません.XORは入力が整数であると仮定し、したがって計算を実行する.しかし、浮動小数点数は整数ではなく、IEEE 754規格によって表されます.そして、それは3つの部分の数字を壊します:符号ビット、指数を表すビットのグループ、および1(包含)と2(排他的)の間の数を表す別のグループ、仮数.したがって、不正な値を取得します.
  • 使えないInfinity and -Infinity 浮動小数点整数で、上記と同じ問題に直面します.
  • を使用する


    IFEまたはすぐに呼び出された関数式は、関数の直後に実行される関数です.これは、2つの数字を交換などのさまざまな仕事をするために使用することができます.
    var a = 12, b = 24;
    
    a = (function (b) {
        return b;
    })(b, b = a)
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    

    I won't prefer this method. Just included for sharing knowledge.


    一時変数の使用


    これは最も一般的な方法です.ここで、一時変数はスワッピングの値の1つを格納するために使用されます.
    var a = 12, b = 24, temp;
    
    temp = a; // temp = 12
    a = b;    // a = 24
    b = a;    // b = 12
    
    console.log(`a = ${a}, b = ${b}`) // a = 24, b = 12
    

    結論


    私は、見つけることができるスワップでgistを作成しましたhere .
    スワッピングにはもっと多くの方法があります.私はいくつかの好ましい選択を挙げた.あなたがより多くの技術を知っているならば、コメントで彼らを共有するために自由に感じてください.