成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一道簡單題看 y 總 C++ 代碼風格優于我自己的地方

開發 前端
給定一個長度為 的由小寫字母構成的字符串 。請你構造一個長度為 的由小寫字母構成的字符串 。本篇就來回答這個問題。

[[417678]]

題目

原題:AcWing 3805. 環形數組[1]

給定一個長度為 的由小寫字母構成的字符串 。

請你構造一個長度為 的由小寫字母構成的字符串 。

要求,字符串 需滿足:

  • 字符串 在字典序上大于字符串 。
  • 字符串 的字母集是字符串 的字母集的子集。一個字符串的字母集是指該字符串包含的所有不同字母的集合,例如 abadaba 的字母集為 。
  • 字符串 在字典序上盡可能小。

保證答案存在。

輸入格式

第一行包含整數 ,表示共有 組測試數據。

每組數據第一行包含兩個整數 和 。

第二行包含一個長度為 的字符串表示 。

輸出格式

每組數據輸出一行滿足所有條件的字符串 。

數據范圍

  • 前三個測試點滿足 。
  • 所有測試點滿足 ,。
  • 同一測試點內,所有 的和不超過 ,所有 的和不超過 。

輸入樣例:

  1. 3 3 
  2. abc 
  3. 3 2 
  4. abc 
  5. 3 3 
  6. ayy 
  7. 2 3 
  8. ba 

輸出樣例:

  1. aca 
  2. ac 
  3. yaa 
  4. baa 

思路:分情況討論

  • 當 k 大于 n 時,前 n 位不變,我們讓 n 位開始填補出現過的最小字符就行
  • 當 k 小于等于 n 時,我們從原字符串 k - 1 位開始往前找,如果當前字符還有變小的可能,那么就讓其變小,尋找停止,輸出新字符串

代碼

  1. #include <iostream> 
  2. #include <cstring> 
  3. #include <algorithm> 
  4. using namespace std; 
  5.  
  6. int n, k; 
  7. bool used[26]; 
  8. string s, t; 
  9.  
  10. string tail() 
  11.     int i = 0; 
  12.     for (; i < 26; ++ i) 
  13.         if (used[i]) break; 
  14.     char a = 'a' + i; 
  15.     string res(k - n, a); 
  16.     return res; 
  17.  
  18. string get() 
  19.     char max_char; 
  20.     for (int i = 25; i >= 0; -- i) 
  21.     { 
  22.         if (used[i]) 
  23.         { 
  24.             max_char = 'a' + i; 
  25.             break; 
  26.         } 
  27.     } 
  28.     char min_char; 
  29.     for (int i = 0; i < 26; ++ i) 
  30.     { 
  31.         if (used[i]) 
  32.         { 
  33.             min_char = 'a' + i; 
  34.             break; 
  35.         } 
  36.     } 
  37.      
  38.     int i = k - 1; 
  39.     for (; i >= 0; -- i) 
  40.     { 
  41.         if (s[i] != max_char) break; 
  42.     } 
  43.      
  44.     string res1 = s.substr(0, i); 
  45.     string res2; 
  46.     for (int j = s[i] - 'a' + 1; j < 26; ++ j) 
  47.     { 
  48.         if (used[j]) 
  49.         { 
  50.             res2 = (char'a' + j; 
  51.             break; 
  52.         } 
  53.     } 
  54.     string res3(k - i - 1, min_char); 
  55.  
  56.     return res1 + res2 + res3; 
  57.  
  58. int main() 
  59.     int T; 
  60.     cin >> T; 
  61.     while (T --) 
  62.     { 
  63.         cin >> n >> k; 
  64.         cin >> s; 
  65.         memset(used, 0, sizeof used); 
  66.         for (int i = 0; i < s.size(); ++ i) used[s[i] - 'a'] = true
  67.         if (k > n) 
  68.         { 
  69.             t = s + tail(); 
  70.         } 
  71.         else 
  72.         { 
  73.             t = get(); 
  74.         } 
  75.         cout << t << endl; 
  76.     } 

可以看出我的代碼思路很清晰,但是寫得有一點冗余。

y 總代碼

看看 y 總的代碼。

  1. #include <iostream> 
  2. #include <cstring> 
  3. #include <algorithm> 
  4.  
  5. using namespace std; 
  6.  
  7. const int N = 100010; 
  8.  
  9. int n, k; 
  10. char s1[N], s2[N]; 
  11. bool st[26]; 
  12.  
  13. char get_min() 
  14.     for (int i = 0; i < 26; i ++ ) 
  15.         if (st[i]) 
  16.             return i + 'a'
  17.     return -1; 
  18.  
  19. char get_next(int t) 
  20.     for (int i = t + 1; i < 26; i ++ ) 
  21.         if (st[i]) 
  22.             return i + 'a'
  23.     return -1; 
  24.  
  25. int main() 
  26.     int T; 
  27.     scanf("%d", &T); 
  28.     while (T -- ) 
  29.     { 
  30.         scanf("%d%d", &n, &k); 
  31.         scanf("%s", s1); 
  32.         memset(st, 0, sizeof st); 
  33.         for (int i = 0; i < n; i ++ ) st[s1[i] - 'a'] = true
  34.         if (k > n) 
  35.         { 
  36.             printf("%s", s1); 
  37.             char c = get_min(); 
  38.             for (int i = n; i < k; i ++ ) printf("%c", c); 
  39.             puts(""); 
  40.         } 
  41.         else 
  42.         { 
  43.             s2[k] = 0; 
  44.             for (int i = k - 1; i >= 0; i -- ) 
  45.             { 
  46.                 char c = get_next(s1[i] - 'a'); 
  47.                 if (c != -1) 
  48.                 { 
  49.                     s2[i] = c; 
  50.                     for (int j = 0; j < i; j ++ ) s2[j] = s1[j]; 
  51.                     break; 
  52.                 } 
  53.                 s2[i] = get_min(); 
  54.             } 
  55.             puts(s2); 
  56.         } 
  57.     } 
  58.  
  59.     return 0; 
  60.  
  61. // 作者:yxc 
  62. // 鏈接:https://www.acwing.com/activity/content/code/content/1634481/ 
  63. // 來源:AcWing 
  64. // 著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 

很簡潔。

經驗:

  • char s[]; puts(s); 中, puts 遇到 \0 注意是 char s[k] = 0 而不是 char s[k] = '0' 字符串停止輸出。

參考資料

[1]AcWing 3805. 環形數組:

https://www.acwing.com/activity/content/problem/content/5457/

 

責任編輯:姜華 來源: Piper蛋窩
相關推薦

2021-04-29 21:06:49

有序數組算法

2022-01-19 11:39:15

數據治理大數據數據

2018-03-13 16:04:45

Promise執行順序

2017-11-21 12:15:27

數據庫面試題SQL

2009-08-11 10:12:07

C#算法

2024-03-18 13:32:11

2009-08-11 14:59:57

一道面試題C#算法

2024-04-28 09:26:40

RustRTTI二進制

2009-08-11 15:09:44

一道面試題C#算法

2021-03-02 11:29:50

算法算法分析前端

2009-01-08 21:21:45

程序員筆記

2022-07-26 01:11:09

AMD芯片Intel

2011-08-18 09:33:23

2024-10-11 17:09:27

2014-04-29 14:58:24

筆試題微軟筆試題

2024-12-30 09:55:00

AI數據模型

2010-01-21 16:18:06

C++語言

2021-04-13 19:05:06

Go閉包面試

2018-03-14 07:42:48

2011-05-23 11:27:32

面試題面試java
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日骚视频 | 91传媒在线观看 | 综合久久综合久久 | 曰韩三级 | 成人免费一区二区三区视频网站 | 亚洲精品一区二区三区中文字幕 | 国产婷婷色综合av蜜臀av | 九九色综合| 国产高清视频 | 欧美激情精品久久久久久变态 | 国产精品视频网 | 国产精品久久久久久妇女 | 精品国产1区2区3区 一区二区手机在线 | 中文字幕视频在线观看免费 | 99精品久久久久久中文字幕 | 黄色91在线| 欧美精品片 | 欧美亚洲国产一区二区三区 | 免费观看成人av | 成人性生交大免费 | 国产中文一区二区三区 | 红色av社区| 你懂的在线视频播放 | 欧美成人免费在线 | 亚洲二区精品 | 草草视频在线免费观看 | 久久久毛片 | 成人综合在线视频 | 国产乱码精品一区二区三区五月婷 | 亚洲成av片人久久久 | 色片在线观看 | 亚洲一区二区三区四区五区中文 | 一区二区三区四区在线视频 | 毛片免费在线 | 亚洲综合一区二区三区 | 人人精品 | 最新中文字幕 | 日日日日操 | 人人澡人人射 | 日韩免费三级 | 伊人伊成久久人综合网站 |