#LeetCode OJ#273.Integer to English Words /CPP

最近發(fā)現(xiàn)一個(gè)很好的網(wǎng)站叫做LeetCodeOJ,注冊(cè)一個(gè)賬號(hào)之后就可以在上面刷題抗碰,進(jìn)一步加深對(duì)語(yǔ)言的熟悉纯续。多造點(diǎn)輪子什么的。網(wǎng)址:https://leetcode.com/
這是我今晚在上面寫(xiě)的一道題。(其實(shí)還寫(xiě)了一道50.pow(x,n)班利,求次方的饥漫,不過(guò)代碼太難看了,為了提高運(yùn)行效率也參考了別人的做法罗标,是在位運(yùn)算的基礎(chǔ)上用了分治策略)
下面這道題目是273.Integer to English Words庸队,先PIA一下這道題的題干

題干.png

這道題目要求我們輸入一個(gè)int然后轉(zhuǎn)化為字符串,題目原理很簡(jiǎn)單闯割,不過(guò)寫(xiě)出來(lái)挺麻煩的彻消。我自己是用了一種運(yùn)行效率很低的寫(xiě)法。(12ms)

rank.png

運(yùn)行效率只超過(guò)了9.47%宙拉,倒數(shù)了=-=宾尚,的確挺差的,有時(shí)間一定找個(gè)更好一點(diǎn)的算法把這東西的效率給提高了谢澈。
我的思路是:
舉個(gè)例子煌贴,對(duì)于2,147,483,647 拆分成2 147 483 647四個(gè)部分

輸出.png

可以發(fā)現(xiàn)規(guī)律是每隔10^3會(huì)有一段0~999的數(shù)字(如上述中的 002 147 483 647),然后002 147 483 647后面接上thousand million billion這些锥忿,所以我定義了一個(gè)dealWithHundred函數(shù)來(lái)輸出0~999的字符串牛郑,在numberToWords中加入thousand million billion最后輸出完整字符串。

dealWithHundred函數(shù)

string s;
        int units = num % 10;//個(gè)位
        int decade0 = num % 100;//含個(gè)位的十位數(shù)
        int decade = decade0 - units;//十位數(shù)
        int hundred = (num - decade0)/100;//百位的數(shù)字
        if (num > 100 && decade0>=20)
        {
            s = a[hundred] + " " + a[100] + " " + a[decade] + " " + a[units];
        }
        else if (num >= 100)
        {
            s = a[hundred] + " " + a[100] + " " + a[decade0];
        }
        else if (num >= 20)
        {
            s = a[decade] + " " + a[units];
        }
        else
        {
            s = a[decade0];
        }
        if (s[s.length() - 1] == ' '&&s.length()!=0)//最后一位為空敬鬓,則刪除
        {
            s = s.substr(0, s.length() - 1);
        }
        return s;

考慮數(shù)字120到有可能在最后的個(gè)位為0 且map中a[0]="",會(huì)使得最后多一個(gè)空格淹朋,所以用s = s.substr(0, s.length() - 1)這條表達(dá)式去刪除那個(gè)空格。
PS.在這個(gè)地方編譯器會(huì)出現(xiàn)assert钉答,畢竟這樣不大安全础芍,不過(guò)是string所以還是沒(méi)有大的問(wèn)題,程序照樣運(yùn)行的下去

以下是完整代碼

#include<iostream>
#include<map>
#include<string>
using namespace std;
class Solution {
public:
    Solution();
    ~Solution();
    string numberToWords(int num);
    string dealWithHundred(int num);
private:
    map<int, string> a;//定義一個(gè)Map数尿,讓鍵值和string對(duì)應(yīng)
    int counter;
    string str, moredigit[4];
};
Solution::Solution()
{
    str = "";
    counter = 0;
    moredigit[0] = "";
    moredigit[1] = "Thousand";
    moredigit[2] = "Million";
    moredigit[3] = "Billion";
    a.insert(pair<int, string>(0, ""));
    a.insert(pair<int, string>(1, "One"));
    a.insert(pair<int, string>(2, "Two"));
    a.insert(pair<int, string>(3, "Three"));
    a.insert(pair<int, string>(4, "Four"));
    a.insert(pair<int, string>(5, "Five"));
    a.insert(pair<int, string>(6, "Six"));
    a.insert(pair<int, string>(7, "Seven"));
    a.insert(pair<int, string>(8, "Eight"));
    a.insert(pair<int, string>(9, "Nine"));
    a.insert(pair<int, string>(10, "Ten"));
    a.insert(pair<int, string>(11, "Eleven"));
    a.insert(pair<int, string>(12, "Twelve"));
    a.insert(pair<int, string>(13, "Thirteen"));
    a.insert(pair<int, string>(14, "Fourteen"));
    a.insert(pair<int, string>(15, "Fifteen"));
    a.insert(pair<int, string>(16, "Sixteen"));
    a.insert(pair<int, string>(17, "Seventeen"));
    a.insert(pair<int, string>(18, "Eighteen"));
    a.insert(pair<int, string>(19, "Nineteen"));
    a.insert(pair<int, string>(20, "Twenty"));
    a.insert(pair<int, string>(30, "Thirty"));
    a.insert(pair<int, string>(40, "Forty"));
    a.insert(pair<int, string>(50, "Fifty"));
    a.insert(pair<int, string>(60, "Sixty"));
    a.insert(pair<int, string>(70, "Seventy"));
    a.insert(pair<int, string>(80, "Eighty"));
    a.insert(pair<int, string>(90, "Ninety"));
    a.insert(pair<int, string>(100, "Hundred"));
}
Solution::~Solution(){}
string Solution::numberToWords(int num)
{
    if (num == 0) { return "Zero"; }
    int thousand = num % 1000;
    str = dealWithHundred(thousand);
    num = (num - num % 1000) / 1000;
    string str0;
    while (num > 0)
    {
        thousand = num % 1000;
        str0 = dealWithHundred(thousand);
        counter++;
        if (thousand != 0)
        {
            str = str0 + " " + moredigit[counter] + " " + str;
            if (str[str.length() - 1] == ' '&&str.length() != 0)
            {
                str = str.substr(0, str.length() - 1);
            }
        }
        num = (num - num % 1000) / 1000;
    }
    return str;
}
string Solution::dealWithHundred(int num)
{
    string s;
    int units = num % 10;//個(gè)位
    int decade0 = num % 100;//含個(gè)位的十位數(shù)
    int decade = decade0 - units;//十位數(shù)
    int hundred = (num - decade0) / 100;//百位的數(shù)字
    if (num > 100 && decade0 >= 20)
    {
        s = a[hundred] + " " + a[100] + " " + a[decade] + " " + a[units];
    }
    else if (num >= 100)
    {
        s = a[hundred] + " " + a[100] + " " + a[decade0];
    }
    else if (num >= 20)
    {
        s = a[decade] + " " + a[units];
    }
    else
    {
        s = a[decade0];
    }
    if (s[s.length() - 1] == ' '&&s.length() != 0)//最后一位為空者甲,則刪除
    {
        s = s.substr(0, s.length() - 1);
    }
    return s;
}
int main()
{
    Solution a;
    int num;
    cin >> num;
    cout << a.numberToWords(num);
}

C++STL里面的東西在內(nèi)存中都比較安全,析構(gòu)函數(shù)我也就沒(méi)有寫(xiě)了(其實(shí)是還沒(méi)研究)

感想:最近在學(xué)Python砌创,這一個(gè)國(guó)慶C++沒(méi)怎么看虏缸,一刷C++的題就發(fā)現(xiàn)了要用map鲫懒,這個(gè)map我之前也只是略知一二。但是最近學(xué)Python后對(duì)于迭代器和dict類型有了一定的理解刽辙,所以我很快就大概知道了map是怎么一回事窥岩,對(duì)于學(xué)習(xí)還是很有用的,編程語(yǔ)言都也是互通的宰缤。

最近還因?yàn)閷W(xué)了Python里面的lambda表達(dá)式颂翼,所以我還特意去看了一下C++的lambda表達(dá)式,lambda表達(dá)式也是一個(gè)很有用的東西慨灭,可以大大簡(jiǎn)化代碼朦乏。

所以其實(shí)覺(jué)得C++的確是博大精深,而且不同的語(yǔ)言之間互通真的特別多氧骤,還是應(yīng)該要繼續(xù)學(xué)習(xí)呻疹,掌握那種思想。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末筹陵,一起剝皮案震驚了整個(gè)濱河市刽锤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌朦佩,老刑警劉巖并思,帶你破解...
    沈念sama閱讀 206,013評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異语稠,居然都是意外死亡宋彼,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)仙畦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)宙暇,“玉大人,你說(shuō)我怎么就攤上這事议泵≌计叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,370評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵先口,是天一觀的道長(zhǎng)型奥。 經(jīng)常有香客問(wèn)我,道長(zhǎng)碉京,這世上最難降的妖魔是什么厢汹? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,168評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮谐宙,結(jié)果婚禮上烫葬,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好搭综,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布垢箕。 她就那樣靜靜地躺著,像睡著了一般兑巾。 火紅的嫁衣襯著肌膚如雪条获。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,954評(píng)論 1 283
  • 那天蒋歌,我揣著相機(jī)與錄音帅掘,去河邊找鬼。 笑死堂油,一個(gè)胖子當(dāng)著我的面吹牛修档,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播府框,決...
    沈念sama閱讀 38,271評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吱窝,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了寓免?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,916評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤计维,失蹤者是張志新(化名)和其女友劉穎袜香,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體鲫惶,經(jīng)...
    沈念sama閱讀 43,382評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜈首,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了欠母。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片欢策。...
    茶點(diǎn)故事閱讀 37,989評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖赏淌,靈堂內(nèi)的尸體忽然破棺而出踩寇,到底是詐尸還是另有隱情,我是刑警寧澤六水,帶...
    沈念sama閱讀 33,624評(píng)論 4 322
  • 正文 年R本政府宣布俺孙,位于F島的核電站,受9級(jí)特大地震影響掷贾,放射性物質(zhì)發(fā)生泄漏睛榄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評(píng)論 3 307
  • 文/蒙蒙 一想帅、第九天 我趴在偏房一處隱蔽的房頂上張望场靴。 院中可真熱鬧,春花似錦、人聲如沸旨剥。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,199評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)泞边。三九已至该押,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間阵谚,已是汗流浹背蚕礼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,418評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留梢什,地道東北人奠蹬。 一個(gè)月前我還...
    沈念sama閱讀 45,401評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像嗡午,于是被迫代替她去往敵國(guó)和親囤躁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 【1】7荔睹,9狸演,-1,5僻他,( ) A宵距、4;B吨拗、2满哪;C、-1劝篷;D哨鸭、-3 分析:選D,7+9=16娇妓;9+(-1)=8像鸡;(...
    Alex_bingo閱讀 18,813評(píng)論 1 19
  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問(wèn)題, 分享了一些自己做題目的經(jīng)驗(yàn)。 張土汪:刷leetcod...
    土汪閱讀 12,724評(píng)論 0 33
  • 【1】 陳勁剛拿到駕照哈恰,今晚開(kāi)著他爸的舊車出去吃夜宵坟桅。車是奧迪A4,挺舊蕊蝗,他爸新買的卡宴倒是新車仅乓,可他不敢開(kāi)。 剛...
    嗶剝嗶剝閱讀 582評(píng)論 4 5
  • 作者|國(guó)家二級(jí)營(yíng)養(yǎng)師傅蓉 這兩天淅淅瀝瀝的雨下個(gè)不停豫喧,秋分已過(guò)石洗,忽想起一句詩(shī):“寒暑迭變,不覺(jué)漸成衰老紧显!” 不過(guò)讲衫,...
    fd28962d16a7閱讀 892評(píng)論 2 1