文字列の左回転:[]移行顔の質問58.2の知識オファー安全性を証明するために、

タイトル説明

左回転(ROL)と呼ばれるアセンブリ言語命令のシフトがあり、そして今、この命令は、文字列操作の結果によってシミュレートされ、簡単なタスクがあります。指定された文字列Sの場合、あなたはKビットのシリアル出力した後、その左の円を入れました。例えば、文字列S =「abcXYZdef」は、三つ、即ち「XYZdefabc」後に必要な出力結果を左回転させました。それは単純ではないですか?OK、それを得ます!
注:この問題は、顔の質問58:フリップ語順展開。

アイデア1

左回転は、実際には2つの部分に文字列であり、そして2つの部品の順序を逆。文字列型は、それが直接のsubstr行うことができる文字列の場合。コードは以下の通りであります:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        if(str=="")
            return "";
        
        string part1 = str.substr(0, n);
        string part2 = str.substr(n, str.length()-n);
        return part2+part1;
    }
};

アイデア2

1つのアイデアは(個人的に簡単な方法コードのアイデアと感じるが)この質問の意図ではありません。この問題は、顔の質問58:反転単語ため拡張、それは同様の方法で行うことができます。(そこにスペースがありますが、考え方は同じですので、まったく同じではない、)私たちは、このような「Hello World」のように、文中の単語の順序を反転すると仮定し、世界の後ろに移動し、ハローに相当し、「世界のこんにちは」に反転しています。この問題のために、我々は、そのような二つの部分に「ABC」「XYZdef」に分けられ、バック、中3「ABC」の前に「abcXYZdef」として二つの部分、に文字列を入れるのは、別に二つの部分を反転させることができ、 「CBA」「fedZYXを与えることXYZdefabcを」「そして与えることを、文字列全体を反転」。プロセスがあるので:
(1)二つの部分に分割された文字列の位置を、
それぞれ二つの部分を、反転(2)、
(3)全体フリップのような2つの部品。
コードは以下の通りであります:

class Solution {
public:
    string LeftRotateString(string str, int n) {
        if(str=="")
            return "";
        
        string part1 = str.substr(0, n);
        string part2 = str.substr(n, str.length()-n);
        part1 = reverse(part1);
        part2 = reverse(part2);
        str = part1+part2;
        return reverse(str);
    }
    
    string reverse(string str){
        int left = 0;
        int right = str.length()-1;
        while(left<right){
            swap(str[left], str[right]);
            left++;
            right--;
        }
        return str;
    }
};

文字列が文字列型である場合は、この方法は本当に簡単な質問に複雑です。この方法は、配列によって表される文字列を使用する場合に適しています。

おすすめ

転載: www.cnblogs.com/flix/p/12530179.html