最近發(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一下這道題的題干
這道題目要求我們輸入一個(gè)int然后轉(zhuǎn)化為字符串,題目原理很簡(jiǎn)單闯割,不過(guò)寫(xiě)出來(lái)挺麻煩的彻消。我自己是用了一種運(yùn)行效率很低的寫(xiě)法。(12ms)
運(yùn)行效率只超過(guò)了9.47%宙拉,倒數(shù)了=-=宾尚,的確挺差的,有時(shí)間一定找個(gè)更好一點(diǎn)的算法把這東西的效率給提高了谢澈。
我的思路是:
舉個(gè)例子煌贴,對(duì)于2,147,483,647 拆分成2 147 483 647四個(gè)部分
可以發(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í)呻疹,掌握那種思想。