有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数,在主函数输入n个整数和输出调整后n个整数.

  1. 这个问题有个经典的解法。
  2. 假设有n个元素,需要将前m(m<n)个元素移动到后面去,则只需要下面三个步骤:
  3. 1、将前m个元素的顺序颠倒
  4. 2、将后面n-m个元素的顺序颠倒
  5. 3、将n个元素的顺序全部颠倒
  6. 这样就可以了!把数组的元素颠倒,这个函数你会写吧?然后只要调用三次即可。
  7. 不是证明的证明:
  8. 伸出你的两只手,手心向上。如果没有意外的话一共10个指头(废话),将所有的指头从左到右编号0, 1, 2, ..., 9。这时候n=10,如果取m=5的话,上述步骤可以转变为下面的步骤:
  9. 1、将左手翻过来,指头的顺序:4, 3, 2, 1, 0, 5, 6, 7, 8, 9
  10. 2、将右手翻过来,指头的顺序:4, 3, 2, 1, 0, 9, 8, 7, 6, 5
  11. 3、将两只手连在一起翻过来,指头的顺序:5, 6, 7, 8, 9, 0, 1, 2, 3, 4
  12. 完成。
  13. -----------------------------------------------
  14. 这个函数实现了指针start到指针end之间的数据的顺序颠倒。
  15. void fun(int* start, int* end)
  16. {
  17.     while( start < end )
  18.     {
  19.         int temp = *start;
  20.         *start = *end;
  21.         *end = temp;
  22.         ++start;
  23.         --end;
  24.     }
  25. 这个函数调用三次实现:
  26. void f(int n, int m, int* numbers)
  27. {
  28.     // 前m个数顺序颠倒
  29.     func(numbers, numbers+m-1);
  30.     // 后n-m个数顺序颠倒
  31.     func(numbers+m, numbers+n-1);
  32.     // 所有数顺序颠倒
  33.     func(numbers, numbers+n-1);
  34. }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值