习题8-3 数组循环右移(20 分)

本题要求实现一个对数组进行循环右移的简单函数:一个数组a中存有n(>0)个整数,将每个整数循环向右移m(≥0)个位置,即将a中的数据由(a?0??a?1???a?n?1??)变换为(a?n?m???a?n?1??a?0??a?1???a?n?m?1??)(最后m个数循环移至最前面的m个位置)。

函数接口定义:

int ArrayShift( int a[], int n, int m );

其中a[]是用户传入的数组;n是数组的大小;m是右移的位数。函数ArrayShift须将循环右移后的数组仍然存在a[]中。

裁判测试程序样例:

#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ ) scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

6 2
1 2 3 4 5 6

输出样例:

5 6 1 2 3 4
#include <stdio.h>
#define MAXN 10

int ArrayShift( int a[], int n, int m );

int main()
{
    int a[MAXN], n, m;
    int i;

    scanf("%d %d", &n, &m);
    for ( i = 0; i < n; i++ )
     scanf("%d", &a[i]);

    ArrayShift(a, n, m);

    for ( i = 0; i < n; i++ ) {
        if (i != 0) printf(" ");
        printf("%d", a[i]);
    }
    printf("\n");

    return 0;
}

/* 你的代码将被嵌在这里 */
int ArrayShift(int a[],int n,int m)
{
    while (m--)//移动的次数
    {
         int temp = a[n - 1];//保留最后一位
        for (int i = n - 1; i >= 1; i--)
        {
            a[i] = a[i - 1];
        }
        a[0] = temp;
    }
}

原文地址:https://www.cnblogs.com/2228212230qq/p/9265316.html

时间: 2024-10-13 21:17:16

习题8-3 数组循环右移(20 分)的相关文章

习题3.12 另类循环队列 (20分)

理解 理解: 实现循环队列 队首Q->Front=(Q->Front+1)%Q->MaxSize; 队尾Q->Rear=(Q->Front+Q->Count)%Q->MaxSize; 删除操作:移动队首,计数器Count--: 插入操作:先执行计数器Count++,在执行向后移动队尾(这里也可以先移动队尾,后执行Count++,知识删除操作取出数的下标要变化): 注意:队首默认为0: bool AddQ(Queue Q,ElementType X) { if(Q-

数组循环右移问题

首先,假设我们有一个具有6个元素的数组: 1,2,3,4,5,6 现在我们要对这个数组循环右移4次,我们很直接很够推出它的结果是:3,4,5,6,1,2 .但是我们如何去实现这样一个问题呢? 我觉得大家最容易想到的方法就是: step1:保存好数组中最后一个元素的值 step2:从第一个元素到倒数第二个元素依次向右移动一个位置 step3:然后将刚保存的值放到空出来的数组第一个位置 虽然这个方法想起来很简单,但是它的效率却不是很高,它的时间复杂度是O(n^2). 现在,我再介绍一种效率较高的算法

线性表(一)&mdash;&mdash;数组循环右移算法

源码:rshift.cpp #include "stdafx.h" #include <stdio.h> /************************************************************************/ /* 数组循环右移算法 */ /************************************************************************/ /* * 要求:只用一个元素大小的辅助空间

数组循环右移

Q:把一个含有 N 个元素的数组循环右移 K 位,要求时间复杂度为 O (N),且只允许使用两个附加变量. 开始的思路: 1.若k=整数倍N, 完成:k大于N,k=N%k:k小于N,开始处理. 2.tmp1保存取出的元素a[k]:a[0]放在k:tmp2保存a[2k], tmp1放入2k:tmp1保存a[3k],tmp2放入3k...直到位置[0]被放入一个新值,一轮循环完毕.这是一个从位置[0]出发,又回到位置[0]的接龙游戏. 仔细考虑下,发现,若N%k==0,则需要从[0]开始,[0]结束

(转)数组循环右移

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次.abcd1234→4abcd123→34abcd12→234abcd1→1234abcd.伪代码如下: 代码清单2-33 RightShift(int* arr, int N, int K) { while(K--) { int t = arr[N - 1]; for(int i = N - 1; i >

习题11-8 单链表结点删除 (20分)

习题11-8 单链表结点删除 (20分) 本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中所有存储了某给定值的结点删除.链表结点定义如下: struct ListNode { int data; ListNode *next; }; 函数接口定义: struct ListNode *readlist(); struct ListNode *deletem( struct ListNode *L, int m ); 函数readlist从标准输入读入一系列正整数,按照读入顺序建立单链表

PAT 1008(数组循环右移问题)

1008 数组元素循环右移问题 (20分) 一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A?0??A?1???A?N−1??)变换为(A?N−M???A?N−1??A?0??A?1???A?N−M−1??)(最后M个数循环移至最前面的M个位置).如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法? 输入格式: 每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0):第2行输入N个整数,之间用空格分隔

5-31 字符串循环左移 (20分)

输入一个字符串和一个非负整数N,要求将字符串循环左移N次. 输入格式: 输入在第1行中给出一个不超过100个字符长度的.以回车结束的非空字符串:第2行给出非负整数N. 输出格式: 在一行中输出循环左移N次后的字符串. 输入样例: Hello World! 2 输出样例: llo World!He #include <stdio.h> #include <stdlib.h> int main() { int N; int length = 0; char a[100],b[100];

习题4-2 求幂级数展开的部分和 (20分)

已知函数e?x??可以展开为幂级数1.现给定一个实数x,要求利用此幂级数部分和求e?x??的近似值,求和一直继续到最后一项的绝对值小于0.00001. 输入格式: 输入在一行中给出一个实数0. 输出格式: 在一行中输出满足条件的幂级数部分和,保留小数点后四位. 输入样例: 1.2 输出样例: 3.3201 #include<stdio.h> #include<math.h> #define eps 1e-5 //0.00001 int main(void) { double x,s