日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

逆序数

發布時間:2023/12/19 综合教程 28 生活家
生活随笔 收集整理的這篇文章主要介紹了 逆序数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


題目:



分析:

題目給出了一段序列,要我們還原出原序列。由于原序列是在1n范圍內,并且是由1n組成的,所以我們可以先給出一個1n的遞增序列List,然后按照一定的規則重新排列,就能得到原序列。而這個排序規則就是根據逆序列來的。一個數a的逆序數表示的是在原序列中,a后面的數中比a小的數的個數。那么反過來,如果給出一個逆序數b,我們只要在List中從小到大數b個數,那么下一個數就是b對應的原來的數。要注意每找一個原來的數后,就要把這個數刪除。按照這個思路,可以用數組實現,也可以用鏈表來做,這里采用的是鏈表。如果用鏈表,那么這道題就相當于是:創建一個長度為n的鏈表,鏈表的數據依次為從1n,然后根據逆序列,對每一個逆序數b,指針從頭開始往右移動b次,輸出下一個結點的數據,并刪除該節點。這樣就可以了。



代碼:

#include<iostream>
#include<stdlib.h>
using namespace std;

struct Numlist
{
    int data;
    Numlist *next;
 };

int main()
{
    int i,j,n,a[500],out[500];
    Numlist *p,*newp,*p1,*head;

    head=(Numlist*)malloc(sizeof(Numlist));
    head->next=NULL;
    p=head;

    cin>>n;

    for(i=0;i<n;i++)
	    cin>>a[i];

    for(i=0;i<n;i++)                                     //創建一個長度為n的鏈表,數據依次為1~n
    {
	    newp=(Numlist*)malloc(sizeof(Numlist));
	    newp->data=i+1;
	    p->next=newp;
	    newp->next=NULL;
	    p=p->next;
    }

    for(i=0;i<n;i++)
    {
	    p=head;
	    for(j=0;j<a[i];j++)                     //指針后移逆序數次
		    p=p->next;
	    p1=p->next;
	    out[i]=p1->data;                       //記錄下一個結點的數據
	    p->next=p1->next;                      //刪除該節點
	    delete p1;                      
    }

    for(i=0;i<n;i++)
	    cout<<out[i]<<" ";
	
    return 0;
 } 


總結

以上是生活随笔為你收集整理的逆序数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。