LeetCode - 344リバース文字列

タイトル

文字列を反転させる機能を記述します。文字の配列[]はcharとして入力文字列が与えられます。

あなたがこれを行う必要があり、別のアレイのための余分なスペースを割り当てません。インプレース入力配列を変更する O(1)余分なメモリで。

あなたはすべての文字が印刷可能なASCII文字で構成想定することができます。

例1:

Input: ["h","e","l","l","o"]
Output: ["o","l","l","e","h"]

例2:

Input: ["H","a","n","n","a","h"]
Output: ["h","a","n","n","a","H"]

問題解決のためのアイデア

これは難易度が追加のメモリ空間を申請する必要はなく、古典的な反転のタイトル文字列であり、かつ複雑さはO(1)である時間を要します。学生のこのタイプの最初の接触は、おそらく無知な力は、実際には、この質問は他の質問に変換することができます。

2つの数xの値を交換する方法、場合yは余分なスペースを取りませんか?

ここで、XOR次のプロパティをXOR演算を解決するために利用することができます。

  1. 2つの排他的論理和の結果の同じ数が0であります
  2. 任意の0の数や、独自のXOR結果
  3. 排他的論理和演算が可換と連想されます

従って、このような考えがある:例えば、第二及び第二最後スワップ位置を入れ替え最初と最後の文字の位置、全サイクルとして、相互に位置を交換する排他的論理和演算により、文字列の最初と最後の文字は所望の効果は、被写体を達成することができるように、数値文字列の長さ/ 2、。コードは以下の通りであります:

class Solution {
    public void reverseString(char[] s) {
        int size = s.length;
        int a = size / 2;
        int last;
        for (int i = 0; i < a; i++) {
            last = size - 1 - i;
            s[i] ^= s[last];
            s[last] ^= s[i];
            s[i] ^= s[last];
        }
    }
}

以下は時間とメモリの消費量は次のとおりです。

ランタイム:1ミリ秒の
メモリ使用量:51.6メガバイト

関連リンク

おすすめ

転載: www.cnblogs.com/yulinlewis/p/10990738.html