逆序数
題目:
分析:
題目給出了一段序列,要我們還原出原序列。由于原序列是在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;
}
總結
- 上一篇: python自动获取号码归属地_Nemo
- 下一篇: 12v60ah锂电池组装图_什么是自放电