翻转问题--旋转数组
Posted 水澹澹兮生烟.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了翻转问题--旋转数组相关的知识,希望对你有一定的参考价值。
问题一:给定一个数组,将数组中的元素向右移动 k 个位置,其中 k 是非负数。
1.借助辅助空间
在直接进行遍历的过程中,我们要将数组移动k个位置,则说明我们需要将数组的所有元素整体移动K次,在每次移动时
我们先分析这个问题,设原数组下标位index;在这里我们画图分析:
从图中,我们可以知道当他要将数组移动k个位置时,每一个其中数组中的每一个元素都要移动到[(index+k)%numsize]的下标下。因此,在这里,我们需要借助辅助空间。
int* reverse_num(int* num, int numsize, int k){//借助辅助空间
//移动到[(index+k)%numsize]的下标下
assert(num != NULL);
int ret = 0;
int* re_num = (int *)malloc(sizeof(int)*numsize);
for (int i = 0; i < numsize; i++){
re_num[(i + k) % numsize] =num[i] ;
}
for (int i = 0; i < numsize; i++){
num[i] = re_num[i];
}
free(re_num);
return num;
}
在这里要注意的是,在动态申请空间后,一定要注意使用完后将他释放,否则有可能会造成内存泄漏。
2.直接进行遍历
我们分析,画图所示:
在图中,我们知道了依次遍历的过程和结果,而我们可以通过遍历整个数组达到循环一次,而要移动k个则要循环k次。
int* reverse_num(int* num, int numsize, int k){//遍历法
int ret = 0;
for (int i = 0; i < k; i++){//控制循环k次
int temp = num[numsize - 1];
for (int j = 0; j < numsize; j++){//因为要进行数组的旋转
//这里借助数组最后一个元素,在交换的过程中,将整个元素向后移动一位
ret = num[j];
num[j] = temp;
temp = ret;
}
}
return num;
}
3.翻转法
在c语言中没有reverse()函数,因此在这里我们自己写了这个函数。
逆置函数:
int* reverse(int* num, int size){
int ret = 0;
for (int i = 0; i < size / 2; i++){
ret = num[i];
num[i] = num[size - i - 1];
num[size - i - 1] = ret;
}
return num;
}
旋转数组函数:
int* reverse_num(int* num, int numsize, int k){//翻转法
assert(num != NULL);
int kx = k%numsize;
reverse(num, numsize-kx);
reverse(num + numsize - kx, kx);
reverse(num, numsize);
return num;
}
最后三种方法的运行代码:
在这里,如果给出字符串翻转,那没就和上面的一样,只需要改变它的数据类型就行了。
**
在这里傻作者总共总结了三种方法,如果有什么错误,欢迎在评论区指正嗷。
以上是关于翻转问题--旋转数组的主要内容,如果未能解决你的问题,请参考以下文章