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


    1008 数组元素循环右移问题

    这个问题实际上还是比较容易解出来的,比如可以用链表,也可以用数组交换,也可按照特定顺序直接输出;

    • 直接输出方式:我们可以想象一下,数据循环移动,不过是从数组的中间部分开始输出,然后回到开头,继续输出,直到数组元素全部输出。比如数组a[10],1 2 3 4 5 6 7 8 9 10 ,当我们移动3个数据位的时候,输出序列就是 :8 9 10 1 2 3 4 5 6 7 ,那么是不是可以取巧,直接从8开始输出,然后回到1,再输出到7呢?——可以

    • 数组交换:我担心直接输出数据不行,那我交换数据,就用那种老老实实的方法,总没问题吧。可以,但是相对复杂一点,首先每一次挪动一个数据,把最后面的数据放入第一个数据位,剩下的往后挪一位,这样循环m次,可以达到我们的目的。然后直接输出即可。

    • 链表方式:我觉得这个方式是比较好的,首先建立链表,当然,采取尾插法比较好,这样产生的链表序列是正序,方便处理。不过还需要注意一点,那就是关于最后一个节点的next应该接上第一个结点。这实际上是一个带头结点的单循环链表。当我们的链表建立完成之后,其实得到了一个围成了一个圆的数据组,我们按照个数m开始数,数到第m+1个数据时,开始输出,直到我们回到这个节点,数据输出完毕,我觉得这样做简便很多。

    下面给出对应的相关代码:

    //直接输出方式
    int
    main() { int N,M; cin>>N>>M; int * array = new int [N]; for(int i = 0;i < N;i++) cin>>array[i]; M = M % N; for(int j = N - M, i = 0;i < N;j++, i++) { if(j == N) j = 0; cout<<array[j]; if(i != N-1) cout<<" "; } return 0; }
    //链表方式
    struct List {
        int data;
        struct List * next;
    };
    
    int main()
    {
        int N,M;
        cin>>N>>M;
        List * head = (List *)malloc(sizeof(List));
        List * p,* temp = head;
      //尾插法建立链表
    for(int i = 0;i < N;i++) { p = (List *)malloc(sizeof(List)); cin >> p->data; temp->next = p; temp = p; }
      //尾结点连接上首节点 temp
    ->next = head->next; temp = head; M = M % N;
      //寻找出输出开头的节点
    for(int i = 0;i < N-M;i++) temp = temp->next; head = temp;
      //输出链表 List
    * out = head->next; for(int i = 0;i < N;i++) { cout << out->data; if(i != N-1) cout << " "; out = out->next; } return 0; }
     //数组交换
    for(i = 0;i < m;i++) {    t = a[n-1];    for(j = n-m;j >= 0;j--) {        a[j+1] = a[j];    }    a[0] = t; }//数据整体往后挪一位,然后最后一位放在最前面,循环m次即可

    2020-07-14

  • 相关阅读:
    栈的应用之银行叫号系统模拟
    栈的应用之括号匹配
    栈的应用之数制转换
    线性结构 一元多项式的乘法与加法运算
    Checkpoints codeforces 709B
    寒冰王座 hdu 1248(背包)
    单链表头插法、尾插法(26个字母为例)
    两个有序单链表的合并
    Number Sequence HDU 1711(KMP)
    完成运算
  • 原文地址:https://www.cnblogs.com/2015-16/p/13301971.html
Copyright © 2020-2023  润新知