編程之美 3.2電話號碼對應英語單詞

來源:互聯網
上載者:User

 原始問題如下:手機上面的數字鍵均對應了幾個字元,譬如2對應了a,b,c。問題是當輸入一段數字後,求出所有可能的字元組合,(可以想象一下發簡訊時候的狀況,每當按幾個數字鍵後,均給出可能的漢語拼音,當然這個要求就更高了,本題只要求給出所有可能的組合)。
舉個例子輸入4,2鍵後,則給出GA,GB,GC,HA,HB,HC,IA,IB,IC組合。
當然對於大多數人來說就是幾層迴圈就搞定了,每層遍曆,內部輸出。但是我們當然是追求更高的演算法了。若按普通做法,那麼每多按一個數字就會導致再添加一個for迴圈了,明顯不合適。下面給出讓你佩服的方法:

#include<iostream>using namespace std;const int MaxLength = 9;char c[10][10] = {"", "", "ABC", "DEF", "GHI", "JKL", "MNO", "PQRS", "TUV", "WXYZ"};int total[10] = {0,0,3,3,3,3,3,4,3,4};int main(){int number[MaxLength] = {2,3,4}; //本例輸入數字2,3,4int answer[MaxLength] = {0};int len = 3;while(true){for(int i = 0; i < len; i++)printf("%c", c[number[i]][answer[i]]);printf("\n");int k = len - 1;while(k >= 0){if(answer[k] < total[number[k]] - 1){answer[k]++;break;}else{answer[k] = 0;k--;}}if(k < 0)break;}return 0;}

 

居然只有兩層迴圈就搞定了,讀了半天都沒讀懂,不過讀懂過後令人非常欽佩啊,原來還可以這麼寫!程式可讀性不強,不過也說明咱讀代碼水平不高,話說牛叉的演算法不都是精簡而高效,可讀性不強麼。
感歎之餘,觀察此演算法也是非常適合排列組合的產生麼。厲害啊。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.