PAT(Basic Level) Practice : 1025 反轉連結串列 (25分)
阿新 • • 發佈:2020-09-20
1025 反轉連結串列 (25分)
難點/坑:測試點5,測試點6
測試點6:沒有說所有給的測試點都是有效的,從頭到尾遍歷連結串列後,要更新節點數目。
比如說:
00100 8 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
66 33 33
78 78 78
8個節點中只有6個是有效的,最後兩個是湊數的。
測試點5:執行超時
把cout換成printf輸出
注意:printf輸出string
string str="test";
printf("%s\n",str.c_str);
程式碼
#include <iostream> #include"stdlib.h" #include <vector> #include <cstdio> //scanf printf防止超時 #include <algorithm> //vector的sort #include <sstream> //轉換 using namespace std; #include<iomanip> //精度 class element { public: string add; int data; string next; element() { add=""; data=0; next=""; } }; int main() { string first; int number; int K; cin>>first>>number>>K; vector<element> List; for(int i=0;i<number;i++) { string add; int data; string next; cin>>add>>data>>next; element temp; temp.add=add; temp.data=data; temp.next=next; List.push_back(temp); } vector<element> right_seq; string point=first; while(point!="-1") { for(int i=0;i<List.size();i++) { if(List[i].add==point) { right_seq.push_back(List[i]); point=List[i].next; } } } //去除無效節點 number=right_seq.size(); int time=number/K; vector<element> res; for(int i=1;i<=time;i++) { for(int j=i*K-1;j>=(i-1)*K;j--) { element temp; temp.add=right_seq[j].add; temp.data=right_seq[j].data; res.push_back(temp); } } if(number%K>0) { for(int i=time*K;i<right_seq.size();i++) { element temp; temp.add=right_seq[i].add; temp.data=right_seq[i].data; res.push_back(temp); } } //cout<<"res"<<endl; for(int i=0;i<res.size()-1;i++) { printf("%s %d %s\n",res[i].add.c_str(),res[i].data,res[i+1].add.c_str()); //cout<<res[i].add<<" "<<res[i].data<<" "<<res[i+1].add<<endl; } printf("%s %d -1\n",res[number-1].add.c_str(),res[number-1].data); //cout<<res[number-1].add<<" "<<res[number-1].data<<" -1"<<endl; return 0; }