上海微信小程序網(wǎng)站建設(shè)活動(dòng)策劃方案詳細(xì)模板
題目部分:
解題思路:
方案一:
首先認(rèn)真審題的小伙伴們一定會(huì)發(fā)現(xiàn)就是題目給了提示只包含小寫字母,也就是說我們的排查范圍是小寫的26個(gè)字母。為了怕有的友友們一時(shí)短路想不起來,我就其按照順序列出來吧。
即:a、b、c、d、e、f、g、h、i、j、k、l、m、n、o、p、q、r、s、t、u、v、w、x、y、z
根據(jù)題意,我們的目標(biāo)就是從給出的字符串中,找出出現(xiàn)的第一個(gè)不重復(fù)出現(xiàn)的小寫26個(gè)字母中的一個(gè),并將其對(duì)應(yīng)在字符串?dāng)?shù)組中的下標(biāo)位置返回去;若找完整個(gè)字符串后,均為重復(fù)出現(xiàn)的子母,即未發(fā)現(xiàn)只出現(xiàn)一次的子母,則返回-1。
附:ASCII表
結(jié)合我們的ASCII表就可以很輕松的做出此題來,根據(jù)該表的提示,我們可以發(fā)現(xiàn)初始字母a所映射對(duì)應(yīng)的整數(shù)是97,那么我們就可以開始做文章了。
定義一個(gè)計(jì)算每個(gè)小寫字母出現(xiàn)次數(shù)的數(shù)組(默認(rèn)我都是按照26個(gè)字母的順序),并初始化為0。
緊接著用一個(gè)循環(huán)來統(tǒng)計(jì)出每個(gè)字母所出現(xiàn)的次數(shù),循環(huán)內(nèi)如何操作呢?代碼走的邏輯就是拿當(dāng)前字符串中當(dāng)前對(duì)應(yīng)的字母映射的整數(shù)值減去字母a映射的整數(shù)值,就能得知該字母在我們統(tǒng)計(jì)出現(xiàn)次數(shù)數(shù)組中的位置,并表示它已經(jīng)出現(xiàn)一次了,所以要在原有次數(shù)上加一。
為了怕大家不懂我統(tǒng)計(jì)次數(shù)循環(huán)內(nèi)代碼走的邏輯,我特意拿示例1來做示范講解。
示例1給的字符串第一個(gè)字母是l,在ASCII表映射對(duì)應(yīng)的整數(shù)是108,前面我們不是有講到初始字母a在該表映射對(duì)應(yīng)的整數(shù)是97嗎?用108-97=11,也就是代表數(shù)組中的第11個(gè)位置(也就是l的位置)的字母出現(xiàn)了一次【需要清楚的是數(shù)組下標(biāo)是從0開始,家人們別忘記了】,因此要在該元素位置次數(shù)+1。
很多xdm可能會(huì)疑惑為什么要減字母a呢?干嘛不減字母b呢?這就是可能you鉆牛角尖了。我在前面就有說過我默認(rèn)的字母數(shù)組出現(xiàn)次數(shù)的排序,是按照它們?cè)镜捻樞?。?duì)應(yīng)關(guān)系就是我下圖所示:
只有從減字母a開始才能對(duì)應(yīng)的了上圖的關(guān)系,若到這里還不能理解的話,我建議大神你回爐重造!
前面所的是第一個(gè)循環(huán),接著是代碼中出現(xiàn)的第二個(gè)循環(huán)的作用——就是找出這個(gè)字符串中第一個(gè)不重復(fù)的字符,然后將其數(shù)組的下標(biāo)返回回去。這第二個(gè)循環(huán)是需要基于第一個(gè)循環(huán)的,若字母都是至少出現(xiàn)了兩次(即重復(fù)),就意味著并不符合題意的要求,按照題目的規(guī)定就返回-1回去。
如果你理解了前面第一個(gè)循環(huán)那么第二個(gè)循環(huán)理解就會(huì)相對(duì)簡單,走的邏輯跟第一個(gè)循環(huán)類似,只不過是為了找出只出現(xiàn)1次的字母,順帶將其數(shù)組下標(biāo)返回即可完成題目要求。
方案一演示代碼講解如下:
附:方案一代碼提取:
class Solution {
public:int firstUniqChar(string s) {// 定義26個(gè)字母出現(xiàn)次數(shù)的數(shù)組,初始化都為0// 默認(rèn)的26個(gè)字母順序?yàn)?#xff1a;a、b、c、d、e...x、y、zint countArray[26] = { 0 };// 統(tǒng)計(jì)每個(gè)字母所出現(xiàn)的次數(shù)for (size_t i = 0; i < s.size(); ++i){countArray[s[i] - 'a']++;}// 找出它第一個(gè)不重復(fù)的字符,并返回?cái)?shù)組下標(biāo)for (int j = 0; j < s.size(); ++j){if (countArray[s[j] - 'a'] == 1){return j;}}return -1;}
};
測(cè)試結(jié)果:
方案一:
不出意外的話家人們必定是狠狠拿下!
備注:
樓主不才,不喜勿噴,若有錯(cuò)誤或需要改進(jìn)的地方,非常感謝你的指出,我會(huì)積極學(xué)習(xí)采納。謝謝家人們一直以來的支持和鼓勵(lì),我會(huì)繼續(xù)努力再接再勵(lì)創(chuàng)作出更多優(yōu)質(zhì)的文章來回報(bào)家人們的。編程愛好的xdm,若有編程學(xué)習(xí)方面的問題可以私信我一同探討(我盡力幫),畢竟“眾人拾柴火焰高”,大家一起交流學(xué)習(xí),共同進(jìn)步!
2023年4月8日