- 这个问题有个经典的解法。
- 假设有n个元素,需要将前m(m<n)个元素移动到后面去,则只需要下面三个步骤:
- 1、将前m个元素的顺序颠倒
- 2、将后面n-m个元素的顺序颠倒
- 3、将n个元素的顺序全部颠倒
- 这样就可以了!把数组的元素颠倒,这个函数你会写吧?然后只要调用三次即可。
- 不是证明的证明:
- 伸出你的两只手,手心向上。如果没有意外的话一共10个指头(废话),将所有的指头从左到右编号0, 1, 2, ..., 9。这时候n=10,如果取m=5的话,上述步骤可以转变为下面的步骤:
- 1、将左手翻过来,指头的顺序:4, 3, 2, 1, 0, 5, 6, 7, 8, 9
- 2、将右手翻过来,指头的顺序:4, 3, 2, 1, 0, 9, 8, 7, 6, 5
- 3、将两只手连在一起翻过来,指头的顺序:5, 6, 7, 8, 9, 0, 1, 2, 3, 4
- 完成。
- -----------------------------------------------
- 这个函数实现了指针start到指针end之间的数据的顺序颠倒。
- void fun(int* start, int* end)
- {
- while( start < end )
- {
- int temp = *start;
- *start = *end;
- *end = temp;
- ++start;
- --end;
- }
- }
- 这个函数调用三次实现:
- void f(int n, int m, int* numbers)
- {
- // 前m个数顺序颠倒
- func(numbers, numbers+m-1);
- // 后n-m个数顺序颠倒
- func(numbers+m, numbers+n-1);
- // 所有数顺序颠倒
- func(numbers, numbers+n-1);
- }
有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数,在主函数输入n个整数和输出调整后n个整数.
最新推荐文章于 2023-10-04 06:00:00 发布