Example: Array = {1, 2, 3, 4, 5 ,6, 7}; n = 4 Output: [4, 5, 6, 7, 1, 2, 3] Explanation: rotate 1 steps to the right: [7, 1, 2, 3, 4, 5, 6] rotate 2 steps to the right: [6, 7, 1, 2, 3, 4, 5] rotate 3 steps to the right: [5, 6, 7, 1, 2, 3, 4] rotate 4 steps to the right: [4, 5, 6, 7, 1, 2, 3]
这个问题可以用两种不同的方法解决。
方法1:复制数组并旋转元素。
在此解决方案中,我们将复制数组,然后根据公式“(i + k)%len”替换项。
这将从要旋转的位置开始。然后将元素从复制数组复制到原始数组。
Test Case: K = 4, hence the position will become i = 0 k = 4 len = 7 (i + k)%len = 4 i = 1 k = 4 len = 7 (i + k)%len = 5 i = 2 k = 4 len = 7 (i + k)%len = 6 i = 3 k = 4 len = 7 (i + k)%len = 0 i = 4 k = 4 len = 7 (i + k)%len = 1 i = 5 k = 4 len = 7 (i + k)%len = 2 i = 6 k = 4 len = 7 (i + k)%len = 3
方法2:将阵列反转3次。
反向1:反向整个数组
反转2:将元素从0反转到k。
反转3:从k反转为n。
C ++解决方案
#include<iostream> #include<vector> using namespace std; vector<int> rotate_method_1(vector<int> array, int k) { int len = array.size(); //take the copy of the array vector<int> array_copy(len); for (int i = 0; i < len; i++) { array_copy[i] = array[i]; } // Rotate the elements. for (int i = 0; i < len; i++) { array[(i + k)%len] = array_copy[i]; } return array; } vector<int> rotate_method_2(vector<int> array, int k) { int len = array.size(); reverse(array.begin(), array.end()); reverse(array.begin(), array.begin()+k%len); reverse(array.begin()+k%len, array.begin()+len); return array; } int main() { std::vector<int> array = {1, 2, 3, 4, 5, 6, 7}; int k = 4; cout<<"Before Rotation "<<endl; for (int i = 0; i < array.size(); i++) { cout <<array[i] << " "; } cout<<"\n\nAfter Rotation using method 1:"<<endl; vector<int> result = rotate_method_1(array, k); for (int i = 0; i < result.size(); i++) { cout <<result[i] << " "; } cout<<endl; cout<<"\n\nAfter Rotation using method 2:"<<endl; result = rotate_method_2(array, k); for (int i = 0; i < result.size(); i++) { cout <<result[i] << " "; } cout<<endl; return 0; }
输出:
Before Rotation 1 2 3 4 5 6 7 After Rotation using method 1: 4 5 6 7 1 2 3 After Rotation using method 2: 4 5 6 7 1 2 3
该网站上可用的教程列表:
C编程20+章 | C ++编程80+章 |
100多个编码问题 | 数据结构和算法85+章 |
系统设计20+章 | Shell脚本编写12章 |
4g LTE 60+章节 | 最常见的编码问题 |
5G NR 50+章 | Linux系统编程20+章 |