美文网首页
数组元素循环右移

数组元素循环右移

作者: 第一号伤心人 | 来源:发表于2018-03-20 13:57 被阅读26次

将一个int[]型数组右移k位,要求最小的空间占用。

一个数组A中存有N(N>0)个数, 在不允许使用任何另外数组的前提下, 将每个整数循环右移M(M>0)位, 考虑移动数据的次数尽量少, 要如何设计移动方法?

示意图

分析1

当然, 最简单的方法莫过于直接每次向右移动一个, 要移动M位, 就移动M次. 代码如下:

//传入操作数组和移动的位数

void moveRight(int Arr[], int M)

{

    //保存下数组的最后一个数

    int endNum = Arr[N-1];

    //将0~N-2位数向后移动一位

    int i;

    for(i=N-1; i>0; i--){

        Arr[i] = Arr[i-1];

    }

    //将最后一位数放在第一位

    Arr[0] = endNum;

}

时间复杂度:

每移动一位就需要做N次赋值操作, 如果移动M位,则需要做NM次赋值操作

分析2

我们先将数组分成两部分, 设后面M位为数组b, 前面N-M位为数组a, 那么怎么数组的组成就是ab.

原始数组是ab, 我的目的是将这个数组变成ba

第一步:将整个长度为N的数组倒置得到 b-1a-1 .

第二步:将 b-1 数组和 a-1 数组分别倒置, 得到 ba数组.

//该函数实现将两个变量互换

void Swap(int *a, int *b)

{

    //得到中间变量

    *a = *a ^ *b;

    //b变量获取到a的值

    *b = *b ^ *a;

    //a变量通过中间变量获取到当时b的值

    *a = *a ^ *b;

}

void moveRight(int Arr[], int N, int M)

{

    int i, j;

    //转置所有的元素

    for(i=N-1, j=0; j

相关文章

  • 数组元素循环右移

    将一个int[]型数组右移k位,要求最小的空间占用。 一个数组A中存有N(N>0)个数, 在不允许使用任何另外数组...

  • 数组元素循环右移问题

    方法1main.cpp shift_heard.h shift.cpp 输出 方法2main.cpp shift....

  • 数组循环问题

    自测-3 数组元素循环右移问题一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移...

  • PAT-B 1008 数组元素循环右移问题(C语言)

    题目 链接:PAT (Basic Level) Practice 1008 数组元素循环右移问题 一个数组A中存有...

  • 1008 数组元素循环右移问题

    一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数...

  • 1008数组元素循环右移问题

    问题描述:一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即...

  • 把一个含有N个元素的数组循环右移K位

    普通解法: 可以每次将数组中的元素右移一位,循环K次。每个元素右移N位后都会回到自己的位置上。因此,如果K > N...

  • 数组循环右移

    //n 是最大的个数 m 是移动的位数void circle(int arr[], int n, int m){...

  • 1008. 数组元素循环右移问题

    原题链接数组元素循环右移问题: 一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向...

  • 1008. 数组元素循环右移问题

    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A...

网友评论

      本文标题:数组元素循环右移

      本文链接:https://www.haomeiwen.com/subject/kuanfftx.html