题目:
思路:
最简单的方法应该是利用for多次将数组的内容一个一个的移动,但是这种方式需要多个双重for循环,比较耗时,所以这里想的方法是尽量在一个for循环中就结束操作,以下分为两种情况,一种是当我要循环的次数少一整个数组长度的一半的时候,还有是超过一半的时候,具体可以看代码,这里有一个要注意的点是,k的次数需要取模(如果是暴力法通过取模可以减少循环的次数),如果k没有取模那么可能就会有错误。
代码:
class Solution {
public:
void rotate(vector<int>& array, int k) {
int length = array.size();
k=k%length;
vector<int> newArray;
if (k < length / 2) {
for (int i = 0; i < k; i++) {
newArray.push_back(array[i]);
array[i] = array[length - k + i];
}
if ((length - k * 2) <= k) {
for (int i = length - 1, j = 0; j < k; i--, j++) {
array[i] = array[i - k];
}
}
else {
for (int i = length - 1, j = 0; j < length - k * 2; i--, j++) {
array[i] = array[i - k];
}
}
for (int i = k, j = 0; j < k; i++, j++) {
array[i] = newArray[j];
}
}
else {
for (int i = 0; i < length - k; i++) {
newArray.push_back(array[i]);
}
for (int i = 0; i < k; i++) {
array[i] = array[length - k + i];
}
for (int i = k, j = 0; i < length; i++, j++) {
array[i] = newArray[j];
}
}
}
};
|