【Code Pratice】—— 猜字母、次数差、交换瓶子
文章目錄
- 1 | 猜字母
- 題目
- 思路
- 邏輯代碼
- 2 | 次數差
- 題目
- 思路
- 邏輯代碼
- 3 | 交換瓶子
- 題目
- 思路
- 邏輯代碼
1 | 猜字母
題目
把abcd…s共19個字母組成的序列重復拼接106次,得到長度為2014的串。
接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數位置的字母。
得到的新串再進行刪除奇數位置字母的動作。如此下去,最后只剩下一個字母,請寫出該字母。
思路
題目關鍵點:
問題就相當于怎么解決上面兩點
怎么確定奇數項?怎么刪除?
- 奇數項確定:if (i % 2)
- 刪除:erase()
怎么重復第一步?
每一次刪除都會改變原有的字母串結構,所以如果每查找到一個就刪除一個的話,就會導致下一個查找的奇數項是原來的偶數項
比如字母串abcdef,刪除第一個奇數項a后,變成了bcdef,這時候再找奇數項就找到了b,但是b本應該是本輪的第一個偶數項
所以在第一步中應該先確定本輪的所有奇數項,然后再做刪除動作
根據上面兩點,大概思路如下
邏輯代碼
void GuessAlphabet(const string& i_cStr) {int inLen = i_cStr.size();if (0 == inLen){cout << "Input parameter is unvalid." << endl;return;}string AlpStr = i_cStr;for (int i = 0; i < 106; i++){AlpStr += i_cStr;}while (1 != AlpStr.size()){vector<int> tmp;for (int i = 0; i < AlpStr.size(); i++){if ((i + 1) % 2){tmp.push_back(i);}}string::iterator it;for (int i = 0; i < tmp.size(); i++){it = AlpStr.begin() + tmp[i] - i;AlpStr.erase(it);}}cout << "The Last Alphabet is [" << AlpStr << "]." << endl; }2 | 次數差
題目
x星球有26只球隊,分別用 a ~ z 的26個字母代表。他們總是不停地比賽。
在某一賽段,哪個球隊獲勝了,就記錄下代表它的字母,這樣就形成一個長長的串。
國王總是詢問:獲勝次數最多的和獲勝次數最少的有多大差距?(當然,他不關心那些一次也沒獲勝的,認為他們在怠工罷了)
輸入格式
一個串,表示球隊獲勝情況(保證串的長度<1000)
abaabcaa
輸出格式
要求輸出一個數字,表示出現次數最多的字母比出現次數最少的字母多了多少次。
4
提示
a 出現 5 次,最多;c 出現1次,最少。
5 - 1 = 4
思路
簡化題目意思就是求一串字母中出現次數最多的字母減去出現次數最少的字母的個數
思路如下:
邏輯代碼
int PoorTimes(const string& i_cStr) {int res = -1;int len = i_cStr.size();if (1 >= len){return res;}string Alphabet = "abcdefghijklmnopqrstuvwxyz";vector<int> AlphabetTimes(26, 0);for (int i = 0; i < len; i++){for (int j = 0; j < 26; j++){if (Alphabet[j] == i_cStr[i]){AlphabetTimes[j]++;}}}Sort(AlphabetTimes);for (int i = 0; i < len; i++){if ((0 != AlphabetTimes[i]) && (0 == AlphabetTimes[i + 1])){res = AlphabetTimes[0] - AlphabetTimes[i];break;}}return res; }3 | 交換瓶子
題目
有N個瓶子,編號 1 ~ N,放在架子上。
比如有5個瓶子:2 1 3 5 4
要求每次拿起2個瓶子,交換它們的位置。
經過若干次后,使得瓶子的序號為:1 2 3 4 5
對于這么簡單的情況,顯然,至少需要交換2次就可以復位。
如果瓶子更多呢?你可以通過編程來解決。
輸入格式為兩行:
第一行: 一個正整數N(N<10000), 表示瓶子的數目
第二行:N個正整數,用空格分開,表示瓶子目前的排列情況。
輸出數據為一行一個正整數:
表示至少交換多少次,才能完成排序。
例子1
輸入:
5
3 1 2 5 4
輸出:
3
例子2
輸入:
5
5 4 3 2 1
輸出:
2
思路
交換有點排序的意思,就是通過每次交換兩個瓶子的位置,使得最后所有瓶子都是按照升序排列的,所以只要保證每個瓶子的數字跟所在下標對應即可
*需要注意:*瓶子數字從1開始,而數組的下標是從0開始的,所以一開始應該先把下標0的位置填充一個0,保證接下來輸入的數字是從1開始存放的
邏輯代碼
int ExchangeBottles(int i_uNum) {int res = -1;if (2 > i_uNum){return res;}res = 0;vector<int> Bottles;Bottles.push_back(0);for (int i = 1; i <= i_uNum; i++){cin >> Bottles[i];}for (int i = 1; i <= i_uNum; i++){if (Bottles[i] != i){for (int j = 1; j <= i_uNum; j++){if (Bottles[j] == i){int tmp = Bottles[i];Bottles[i] = Bottles[j];Bottles[j] = tmp;res++;}}}}return res; }總結
以上是生活随笔為你收集整理的【Code Pratice】—— 猜字母、次数差、交换瓶子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 根据三点坐标计算夹角
- 下一篇: 评WSO2/WSF系列框架之设计