按位置旋转一维数组算法

 

一种一维数组按从第i个位置“旋转”,例如abcdefgh, i = 3,则旋转后变为defghabc

Code:
  1. /*  
  2.   rotate a one-dimensinal vector of n elements left by i positions. For instance,  
  3.   with n=8 and i=3, the vector abcdefgh is rotated to defghabc. Simple code uses an  
  4.   n-element intermediate vector to do the job in n steps. Can you rotate the vector  
  5.   in time proportional to n using only a few dozen extra bytes of storage.  
  6. */  
  7. #include <iostream>   
  8. using namespace std;   
  9. void rotate(const int length, const int pos, int * vec);   
  10. void reverse(int *vec, int beg, int end);   
  11. int main()   
  12. {   
  13.     int test[] = {1,2,3,4,5,6,7};   
  14.     rotate(7,7,test);   
  15.     for(int i = 0; i<= 6; i++)   
  16.     {   
  17.         cout<<test[i]<<endl;   
  18.     }   
  19. }   
  20.   
  21. //采用3此倒序数组的方法rotate.   
  22. void rotate(const int length, const int pos, int * vec)   
  23. {   
  24.     reverse(vec, 0, pos-1);   
  25.     reverse(vec,pos,length-1);   
  26.     reverse(vec,0, length-1);   
  27. }   
  28.   
  29. //倒排一个数组   
  30. void reverse(int *vec, int beg, int end)   
  31. {   
  32.     int sum = beg+end;   
  33.     int tmp;   
  34.     for(int i = beg; i<= (beg+end)/2; i++)   
  35.     {   
  36.         tmp = vec[i];   
  37.         vec[i] = vec[sum-i];   
  38.         vec[sum-i] = tmp;   
  39.     }   
  40. }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设有一个 $n \times n$ 的二维数组 $matrix$,我们要将其顺时针旋转 $90$ 度,可以通过以下步骤实现: 1. 先将矩阵沿主对角线翻转,即将 $matrix[i][j]$ 与 $matrix[j][i]$ 交换。 2. 再将每一行沿中心线翻转,即将 $matrix[i][j]$ 与 $matrix[i][n-1-j]$ 交换。 代码如下: ```c++ void rotate(int** matrix, int matrixSize, int* matrixColSize){ // Step 1: 沿主对角线翻转 for(int i=0; i<matrixSize; i++){ for(int j=i; j<matrixSize; j++){ int temp = matrix[i][j]; matrix[i][j] = matrix[j][i]; matrix[j][i] = temp; } } // Step 2: 每一行沿中心线翻转 for(int i=0; i<matrixSize; i++){ for(int j=0; j<matrixSize/2; j++){ int temp = matrix[i][j]; matrix[i][j] = matrix[i][matrixSize-1-j]; matrix[i][matrixSize-1-j] = temp; } } } ``` 在使用指针旋转的时候,我们需要将二维数组转化为一维指针,这里我们可以使用 $int* matrix$ 来表示二维数组,其中 $matrix[i][j]$ 可以表示为 $matrix[i \times n + j]$,其中 $n$ 表示矩阵的宽度或长度。 代码如下: ```c++ void rotate(int* matrix, int matrixSize, int* matrixColSize){ // Step 1: 沿主对角线翻转 for(int i=0; i<matrixSize; i++){ for(int j=i; j<matrixSize; j++){ int temp = *(matrix + i * matrixSize + j); *(matrix + i * matrixSize + j) = *(matrix + j * matrixSize + i); *(matrix + j * matrixSize + i) = temp; } } // Step 2: 每一行沿中心线翻转 for(int i=0; i<matrixSize; i++){ for(int j=0; j<matrixSize/2; j++){ int temp = *(matrix + i * matrixSize + j); *(matrix + i * matrixSize + j) = *(matrix + i * matrixSize + matrixSize - 1 - j); *(matrix + i * matrixSize + matrixSize - 1 - j) = temp; } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值