C语言解决轮转数组
轮转数组 | LeetCode
https://leetcode.cn/problems/rotate-array/description/
方法一:暴力求解
void rotate(int* nums, int numsSize, int k) {int l = 0;int r = 0;k %= numsSize;int n = 0;while (n++ < k){for (r = numsSize - 1, l = r - 1; l >= 0; r--,l--){*(nums + r) = *(nums + r) ^ *(nums + l);*(nums + l) = *(nums + r) ^ *(nums + l);*(nums + r) = *(nums + r) ^ *(nums + l);}}for (n = 0; n < numsSize; n++){printf("%d", *(nums + n));}
}
每右旋一次就需要执行N次,所以时间复杂度的最坏的情况:右旋N-1次。
(N-1\*N),时间复杂度O(N^2),空间复杂度O(1)
方法二:开辟额外数组
void rotate(int* nums, int numsSize, int k) {k %= numsSize;int* str = (int*)malloc( sizeof(int)*numsSize );memcpy(str, nums, numsSize*sizeof(int));memcpy(nums, str + numsSize - k, sizeof(int)*k);memcpy(nums + k, str, sizeof(int)*(numsSize - k));int n = 0;for(n = 0; n < numsSize; n++){printf("%d", *(nums + n));}free(str);str= NULL;
}
先开辟一个新的数组,完全拷贝原数组。然后从新数组把要右旋的数字直接拷贝到原数组的开头,其他的数字拷到原数组的末尾。
时间复杂度是O(N),空间复杂度O(N)。
方法三:逆序法
void Reverse(int* str, int n)
{int l = 0;int r = n - 1;for(;l < r; l++, r--){*(str + l)= *(str + l) ^ *(str + r);*(str + r)= *(str + l) ^ *(str + r);*(str + l)= *(str + l) ^ *(str + r);}
}
void rotate(int* nums, int numsSize, int k) {k %= numsSize;Reverse(nums,numsSize - k);Reverse(nums + numsSize - k, k);Reverse(nums, numsSize);int i = 0;for(i = 0; i < numsSize; i++){printf("%d",*(nums+i));}
}
将前n-k个数字逆序,再将后面的k个数字逆序,最后整体逆序。
