22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)
生活随笔
收集整理的這篇文章主要介紹了
22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
勵志用盡量少的代碼做高效表達
題目(提交)鏈接——>Uva-1584
因為是水題,因此做題重心由解題轉向優化
核心思路:
本題共有三種解法:
解法一、string字符串中assign()+erase()截取字符串模擬循環
?大概思路是利用assign()賦值序列的前半部分,用一中間變量保存,同時用erase()刪除前半部分,將后半部分與中間變量連接,就是一條新鏈,循環取字典序最小者
解法二、取余模擬循環(書中解法)
?大概思路就是利用取余將序列從邏輯上連接起來,每次從頭逐個比較序列,保存較小的,最后輸出。
解法三、循環鏈表求解
?物理上將序列首尾相連,效率低,編寫較麻煩,不推薦。
解法一源碼:
#include<bits/stdc++.h> using namespace std; int main() {int n; cin >> n; while(n--) {string sTruely; //存放輸入串 string sMin; //存放最小的字典序表示 string sTemporary; //等于輸入串,做臨時變量 cin >> sTruely; //輸入 sMin = sTruely; //最小字典序串設初始值 int len = sTruely.length(); for(int i = 1; i < len; i++) {sTemporary = sTruely; //臨時變量代替輸入串 string t; t.assign(sTemporary,0,i); //串t賦給前i位 sTemporary.erase(0,i); //臨時變量刪除前i位 t = sTemporary+t; //串t=臨時變量+串t if(sMin > t) sMin = t; //判斷 }cout << sMin << '\n';} return 0; }解法二注意事項:
這里我用C++寫法將書中源碼敲了一遍,可奇怪的是,總是彈出錯誤:
但反復檢查,除了我使用了C++的寫法,其他與書中代碼并無出入,真是人間迷惑?(⊙_⊙)?
最后發現問題出在函數名less中, 命名空間using namespace std;中包含less關鍵字,導致C++無法編譯成功。 將less改為Less方通過編譯。
解法二代碼:
#include<bits/stdc++.h> #define maxn 105 using namespace std; char s[maxn]; bool Less(const char* s, int p, int q) { //p為i,q為ans int n = strlen(s);for(int i = 0; i < n; i++) if(s[(p+i)%n] != s[(q+i)%n]) return s[(p+i)%n] < s[(q+i)%n];return 0; //相等 } int main() {int T; cin >> T; while(T--) {cin >> s;int ans = 0, n = strlen(s);for(int i = 1; i < n; i++) if(Less(s, i, ans)) ans = i; //比較首字母,若后者首字母較小,ans記錄后者位置。 for(int i = 0; i < n; i++) putchar(s[(i+ans)%n]);putchar('\n'); }return 0; }撥云見日,未來可期
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的22行代码AC,三种解法——例题3-6_环状序列(UVa-1584)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 小白也能看懂——使用dev-c++建立工
- 下一篇: 19行代码AC——习题3-4 周期串(U