算法题---数组元素循环右移

试设计一个算法,将数组A中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n).
分析:我们看这个数组123456,循环右移2位。先将数组逆序,654321,交换3次,然后交换前两个,564321,然后右面四个数字逆序,则561234,交换2次,正好是6次,并且在交换数据的时候,只使用了一个附加存储空间,正好满足题意。
 

#include <stdio.h> #include <stdlib.h> #include<iostream> #define maxsize 20 int arr[maxsize];

using namespace std;

void exchange_tool(int* arr, int len)

{  int i;  

int temp;

 for (i = 0; i<(len + 1) / 2; i++)  {   temp = *(arr + i);   *(arr + i) = *(arr + len - i);   *(arr + len - i) = temp;}

}

void rotate(int*arr, int n, int m)

{  m = m%n;

 exchange_tool(arr, n);  

exchange_tool(arr, m);  

exchange_tool(arr + m, n - m);

}

int main()

{  int n, k, i;

 while (1)  {   

cout << "数组长度?" << endl;   cin >> n;  

 cout << "右循环几位?" << endl;  

 cin >> k;

  cout << "输入数字:" << endl;

  for (i = 0; i < n; i++)   {    cin >> *(&arr[i]); }

  rotate(arr, n, k);  

 for (i = 0; i < n-1; i++) {cout << arr[i] << " ";  }

 cout << arr[i] << endl;  

 cout << endl;

 }  

 return 0;

}

其中有2个地方要注意
1. for(i=0;i<(len+1)/2;i++),正好可以避开奇数和偶数的判断,大家自己琢磨一下。
2.k = k%6;k的次数有可能大于6,,6的整数倍的右移还是本身,于是就求余吧。
其实这道题目一个元素的附加存储空间都可以省去,因为交换两个值不需要附加空间,我们有^.
如下:
void swap(char& a,char& b)
{
   a = a^b;
   b = a^b;
   a = a^b; 
}
这里用到了引用。大家推导一下,因为a^a = 0和a^0 = a。如果用指针的话,如下:
void swap(char* a,char* b)
{
   *a = *a^*b;
   *b = *a^*b;
   *a = *a^*b; 
}
 
 

转载于:https://www.cnblogs.com/luckyraye/p/6714179.html

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值