タイトル
右回転のkビット列
k=0 1 2 3 4 5
k=1 5 1 2 3 4
k=2 4 5 1 2 3
...
道路の問題が複数の実装を持つことができます解決するために、私はさらにいくつかの興味深い、約書くために選びました。
この方法の一つ
void Fun(vector<int> &nums,int k){
while(--k>=0){
nums.insert(nums.begin(),nums.back());
nums.pop_back();
}
}
コードがない以上より、簡単です。ダイナミックアレイの借用利点は、複雑性O(k)は、実際にはまだ比較的時間がかかる(ベクター挿入および欠失)であってもよいです。に応じてkの値(配列の長さとkの大きさとの関係を最適化する)ことができます。
void Fun(vector<int> &nums,int k){
k = k % nums.size();
//根据k与nums.size()/2的大小关系来进行分别处理
if(k>nums.size()/2){
while (++k<=nums.size()){
nums.push_back(nums.front());
nums.erase(nums.begin());
}
}else{
while (--k>=0){
nums.insert(nums.begin(),nums.back());
nums.pop_back();
}
}
}
方法二
void Fun(vector<int> &nums,int k){
k = k % nums.size();
if(k>0) {
reverse(nums.begin(), nums.end());
reverse(nums.begin(), nums.begin() + k);
reverse(nums.begin() + k, nums.end());
}
}
コードは、ダイナミックアレイ、簡単なのと同じ方法を使用して、言うが、オフセットしません。
メソッドスリー
右側にKビットは、原稿が+ kは、以下のアルゴリズムが考えに基づいて設計されているIの位置に移動し、i番目のビットの配列として理解することができます。
void Fun(vector<int> &nums,int k){
for(int i=0,count = 0;count<(int)nums.size();++i){
int j=i;
int temp = nums[i];
do{
j+=k;
j=j%(int)nums.size();
swap(nums[j],temp);
++count;
}while(j!=i);
}
}
O(N)の時間計算量は、空間的複雑度はO(1)です。このアルゴリズムは、通常の配列またはダイナミックアレイ、高効率化に適しています。