日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Code Pratice】—— 猜字母、次数差、交换瓶子

發(fā)布時間:2024/1/1 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Code Pratice】—— 猜字母、次数差、交换瓶子 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 1 | 猜字母
    • 題目
    • 思路
    • 邏輯代碼
  • 2 | 次數(shù)差
    • 題目
    • 思路
    • 邏輯代碼
  • 3 | 交換瓶子
    • 題目
    • 思路
    • 邏輯代碼

1 | 猜字母

題目

把a(bǔ)bcd…s共19個字母組成的序列重復(fù)拼接106次,得到長度為2014的串。
接下來刪除第1個字母(即開頭的字母a),以及第3個,第5個等所有奇數(shù)位置的字母。
得到的新串再進(jìn)行刪除奇數(shù)位置字母的動作。如此下去,最后只剩下一個字母,請寫出該字母。

思路

題目關(guān)鍵點:

  • 每次刪除當(dāng)前字母串的奇數(shù)項
  • 重復(fù)第一步直到剩余一個字母
  • 問題就相當(dāng)于怎么解決上面兩點

  • 怎么確定奇數(shù)項?怎么刪除?

    • 奇數(shù)項確定:if (i % 2)
    • 刪除:erase()
  • 怎么重復(fù)第一步?
    每一次刪除都會改變原有的字母串結(jié)構(gòu),所以如果每查找到一個就刪除一個的話,就會導(dǎo)致下一個查找的奇數(shù)項是原來的偶數(shù)項
    比如字母串a(chǎn)bcdef,刪除第一個奇數(shù)項a后,變成了bcdef,這時候再找奇數(shù)項就找到了b,但是b本應(yīng)該是本輪的第一個偶數(shù)項
    所以在第一步中應(yīng)該先確定本輪的所有奇數(shù)項,然后再做刪除動作

  • 根據(jù)上面兩點,大概思路如下

  • 判斷當(dāng)前字母串長度是否為1,不是則遍歷當(dāng)前字母串,找出所有的奇數(shù)項下標(biāo)并保存,是則返回結(jié)果
  • 根據(jù)保存的奇數(shù)項下標(biāo),刪除對應(yīng)字母,這里要注意,沒刪除一個字母,字母串的長度就會減一,所以刪除的時候,下標(biāo)要跟著長度變化
  • 重復(fù)以上兩步
  • 邏輯代碼

    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 | 次數(shù)差

    題目

    x星球有26只球隊,分別用 a ~ z 的26個字母代表。他們總是不停地比賽。
    在某一賽段,哪個球隊獲勝了,就記錄下代表它的字母,這樣就形成一個長長的串。
    國王總是詢問:獲勝次數(shù)最多的和獲勝次數(shù)最少的有多大差距?(當(dāng)然,他不關(guān)心那些一次也沒獲勝的,認(rèn)為他們在怠工罷了)

    輸入格式
    一個串,表示球隊獲勝情況(保證串的長度<1000)
    abaabcaa

    輸出格式
    要求輸出一個數(shù)字,表示出現(xiàn)次數(shù)最多的字母比出現(xiàn)次數(shù)最少的字母多了多少次。
    4
    提示
    a 出現(xiàn) 5 次,最多;c 出現(xiàn)1次,最少。
    5 - 1 = 4

    思路

    簡化題目意思就是求一串字母中出現(xiàn)次數(shù)最多的字母減去出現(xiàn)次數(shù)最少的字母的個數(shù)
    思路如下:

  • 定義26長度的數(shù)組,代表26位字母,從頭開始遍歷這串字母
  • 判斷當(dāng)前字母是哪個,對應(yīng)數(shù)組位內(nèi)容加一
  • 遍歷完全字母串后,對數(shù)組進(jìn)行排序
  • 最高位值減去最低位值(非0)即為最后答案
  • 邏輯代碼

    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個瓶子,交換它們的位置。
    經(jīng)過若干次后,使得瓶子的序號為:1 2 3 4 5
    對于這么簡單的情況,顯然,至少需要交換2次就可以復(fù)位。
    如果瓶子更多呢?你可以通過編程來解決。
    輸入格式為兩行:
    第一行: 一個正整數(shù)N(N<10000), 表示瓶子的數(shù)目
    第二行:N個正整數(shù),用空格分開,表示瓶子目前的排列情況。

    輸出數(shù)據(jù)為一行一個正整數(shù):
    表示至少交換多少次,才能完成排序。

    例子1
    輸入:
    5
    3 1 2 5 4

    輸出:
    3

    例子2
    輸入:
    5
    5 4 3 2 1

    輸出:
    2

    思路

    交換有點排序的意思,就是通過每次交換兩個瓶子的位置,使得最后所有瓶子都是按照升序排列的,所以只要保證每個瓶子的數(shù)字跟所在下標(biāo)對應(yīng)即可

  • 遍歷每一個瓶子,判斷當(dāng)前下標(biāo)和瓶子的數(shù)字是否對應(yīng)
  • 如果對應(yīng)則遍歷下一個
  • 如果不對應(yīng),則尋找到當(dāng)前下標(biāo)對應(yīng)的瓶子數(shù)字的下標(biāo),并交換位置,次數(shù)+1
  • 重復(fù)以上步驟,直到遍歷完所有瓶子
  • *需要注意:*瓶子數(shù)字從1開始,而數(shù)組的下標(biāo)是從0開始的,所以一開始應(yīng)該先把下標(biāo)0的位置填充一個0,保證接下來輸入的數(shù)字是從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; }

    總結(jié)

    以上是生活随笔為你收集整理的【Code Pratice】—— 猜字母、次数差、交换瓶子的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。