#原創(chuàng)
之前老是對(duì)牛頓的“站在巨人肩膀上”有點(diǎn)誤解,咱不否認(rèn)牛頓在數(shù)學(xué)玄叠,物理上的才華與對(duì)人類的貢獻(xiàn)欣尼,因?yàn)榕nD啥人品咱也都知道祸穷,誤解他在所難免∶溃現(xiàn)在發(fā)現(xiàn)楊絳先生的“你的問題主要在于讀書不多而想得太多”愈發(fā)正確,書是人們智慧的載體粱哼,天才的存在使得書更有價(jià)值。多讀書檩咱,站在巨人的肩膀上是有意義的揭措,與其活在自己的世界里踽踽獨(dú)行,不如包容的心態(tài)學(xué)習(xí)前人的經(jīng)驗(yàn)刻蚯。曾一直思考绊含,其實(shí)歲月悠悠,哦炊汹,shit躬充,大爺直接過來把自習(xí)室燈關(guān)了,我就一人還在這黑燈瞎火的抒情,咳咳充甚,繼續(xù)以政,說那兒了,伴找,盈蛮,,技矮,(此處卡頓30s)哦抖誉,你思考的問題早有人為你思考過了,多看書是快速生長(zhǎng)的一種方法衰倦,不用摸著石頭過河了嘛袒炉!
廢話不多說,看題樊零,非計(jì)算機(jī)學(xué)生慎看我磁。
編碼工作常被運(yùn)用于密文或壓縮傳輸。這里我們用一種最簡(jiǎn)單的編碼方式進(jìn)行編碼:把一些有規(guī)律的單詞編成數(shù)宇淹接。
字母表中共有26個(gè)字母{a十性,b,…塑悼,z}劲适,這些特殊的單詞長(zhǎng)度不超過6且字母按升序排列。把所有這樣的單詞放在一起厢蒜,按字典順序排列霞势,一個(gè)單詞的編碼就對(duì)應(yīng)著它在字典中的位置。
例如:
a→1 b→2 z→26 ab→27 ac→28
你的任務(wù)就是對(duì)于所給的單詞斑鸦,求出它的編碼愕贡。
輸入輸出格式
輸入格式:
僅一行,被編碼的單詞巷屿。
輸出格式:
僅一行固以,對(duì)應(yīng)的編碼。如果單詞不在字母表中嘱巾,輸出0憨琳。
輸入樣例 :ab 輸出樣例:27
該題目來源于洛谷,洛谷平臺(tái)未標(biāo)注出題作者
OK旬昭,進(jìn)入正題篙螟,首先搞清升序與非遞減的區(qū)別,即按字典序升序就保證了該編碼制度下沒有相同的字母问拘。
所以a->1,b->2,c->3, ,z->26,aa->27,ab->28, , ,ba->53是錯(cuò)誤的,也就是說不能看成由a~z組成的26進(jìn)制編碼成10進(jìn)制遍略,對(duì)吧惧所?
Alright,發(fā)動(dòng)你聰明的小腦瓜绪杏,抽象出該題背后的數(shù)據(jù)結(jié)構(gòu)下愈,想想它長(zhǎng)什么樣子了。
那些對(duì)“數(shù)據(jù)結(jié)構(gòu)”概念一臉迷茫的孩子寞忿,可以繼續(xù)閱讀驰唬,牛犇可以略過。
數(shù)組結(jié)構(gòu)的核心技術(shù)是分解和抽象腔彰。
首先對(duì)數(shù)據(jù)進(jìn)行分解和抽象叫编,通過分解劃分出數(shù)據(jù)的層次(數(shù)據(jù)-數(shù)據(jù)元素-數(shù)據(jù)項(xiàng));再經(jīng)過抽象霹抛,舍棄數(shù)據(jù)元素的具體內(nèi)容搓逾,得到數(shù)據(jù)的邏輯結(jié)構(gòu)。
其次是處理的分解和抽象杯拐,通過分解將需求劃分成各個(gè)功能霞篡;再經(jīng)過抽象舍棄實(shí)現(xiàn)細(xì)節(jié)得到算法。
好吧端逼,我也不羅嗦了朗兵,你肯定想掌握數(shù)據(jù)結(jié)構(gòu)最重要的東西吧。
邏輯結(jié)構(gòu)是你學(xué)數(shù)據(jù)結(jié)構(gòu)必須掌握的顶滩,否則余掖,嘿嘿嘿,你可能要叨念"Data structure fucks me"或者"Life sucks because of data structure "了礁鲁。
邏輯結(jié)構(gòu)分為線性結(jié)構(gòu)和非線性結(jié)構(gòu)盐欺。
線性結(jié)構(gòu)元素之間的關(guān)系是一對(duì)一對(duì)的,如線性表仅醇,向量冗美,棧(重要),隊(duì)列(重要)析二,優(yōu)先隊(duì)列粉洼,字典等。
非線性結(jié)構(gòu)可能是一對(duì)多叶摄,即樹(真重要)漆改,多對(duì)多,即圖(真重要)本人覺得數(shù)據(jù)結(jié)構(gòu)的博大精深從這兒開始就體現(xiàn)出來了准谚。
/這是我的第一篇簡(jiǎn)書:-),還可以去gitee.com/cipolee/
下面是我理解的該題背后的結(jié)構(gòu)去扣。
理科男靈魂畫師一個(gè)柱衔,不會(huì)畫圖樊破,嗚嗚嗚,唆铐,
哎哎哎哲戚,對(duì)了,這才叫抽象嘛艾岂,嘿嘿嘿顺少,邏輯結(jié)構(gòu)要的就是抽象。
咳咳咳王浴,前方高能脆炎。
每種邏輯結(jié)構(gòu)背后都有,查找氓辣,遍歷秒裕,插入,建立钞啸,刪除几蜻。如果繼續(xù)抽象,遍歷屬于查找体斩,建立屬于插入梭稚。
這個(gè)題不就是讓你找到編碼規(guī)律后為單詞編碼(第一步),存起來(第二步)絮吵,然后給你個(gè)單詞你往存起來的地方查找弧烤,找到你就能輸出答案了,就這么easy源武。
第一步扼褪,編碼規(guī)律你已經(jīng)知道,就是上面的樹粱栖,可以用DFS把樹的每一條枝子(路徑)即一個(gè)單詞搜索一遍得到編碼結(jié)果话浇。
第二步,存起來闹究,用什么存容易查找呢幔崖,還能代碼容易實(shí)現(xiàn),時(shí)間復(fù)雜度還低渣淤?
ummm赏寇,如果你夠懶你會(huì)說我啥也不想用,就想給我單詞我就能把編碼輸出价认。對(duì)嗅定!你這個(gè)想法很聰明,這時(shí)你會(huì)發(fā)現(xiàn)你需要一個(gè)由單詞到數(shù)字的映射用踩。用map存渠退!
所有大的問題都解決忙迁,開始寫代碼,代碼中出現(xiàn)的細(xì)節(jié)在代碼里注釋碎乃。
#include<iostream>
#include<map>
using namespace std;
map<string,int>M;//可以理解有一個(gè)M對(duì)象它從string字符串映射到一個(gè)整數(shù)及答案姊扔。
int cnt=1;
//cnt是計(jì)數(shù)器,初始a為1梅誓。
string all,one;
//all是為了給各個(gè)單詞存編碼而生成的所有種類的字符串(枚舉的思想)恰梢,而one是你要輸入的字符串。
void DFS(int length,int k)//length是單詞長(zhǎng)度梗掰,k深搜的層數(shù)
{
if(k>length)//深搜邊界
{
M[all]=cnt++;
return ;
}
char i,j;
if(k==1)
j='a';
else
j=all[k-2]+1;//k-2=k-1(回到上一層)-1(數(shù)組從0開始編號(hào)嵌言,找到上一個(gè)字母)+1(保證升序,大一個(gè))
for(i=j;i<='z';i++)
{
all[k-1]=i;
DFS(len,k+1);
//為什么它就能按深搜的那個(gè)過程走一遍愧怜,你看執(zhí)行到邊界return呀页,就回溯到上一層,上一層按順序往后執(zhí)行拥坛,然
//后依此類推
}
int main()
{
int n;//單詞字母?jìng)€(gè)數(shù)蓬蝶。
for(n=1;n<=6;n++)
{
all.clear();
all.resize(n);
DFS(n,1);
}
cin>>one;
cout<<M[one]<<endl;
return 0;
}
其實(shí)仔細(xì)思考DFS(depth first search深度優(yōu)先搜索)和BFS(breadth first search廣度優(yōu)先搜索),就會(huì)發(fā)現(xiàn)其中的哲學(xué)思想猜惋,一個(gè)是一下子走到底丸氛,不到黃河不死心,玩深度著摔;一個(gè)是先把最近的先走一遍缓窜,再往下走,重廣度谍咆。
而棧禾锤,先進(jìn)后出,隊(duì)列摹察,先進(jìn)先出恩掷。這先進(jìn)先出,先進(jìn)后出所反映的思想在算法甚至在生活中也普遍存在供嚎。如果深度理解黄娘,你會(huì)發(fā)現(xiàn)DFS是棧的操作,BFS是隊(duì)列的操作克滴。
是不是發(fā)現(xiàn)這幾行代碼比一篇網(wǎng)絡(luò)小說的信息量大多了逼争。
新時(shí)代大學(xué)生,在每日巨大的信息沖擊下劝赔,很難接受文藝的辭藻華麗的詩詞誓焦,從接受信息獲得快感的閾值越來越高,為此他們會(huì)瀏覽更多的信息着帽,為此不浪費(fèi)碎片的時(shí)間去看快手杂伟,抖音竿秆,在花花綠綠的信息流中接受須臾的感官刺激,垃圾信息害人太慘稿壁,代碼中都是智慧的結(jié)晶,不僅包含的信息多歉备,質(zhì)量還高傅是。
多讀書不愿意?多讀代碼就好了蕾羊。