タイトル説明
左回転(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;
}
};
文字列が文字列型である場合は、この方法は本当に簡単な質問に複雑です。この方法は、配列によって表される文字列を使用する場合に適しています。