C++ LeetCode1805字符串不同整數(shù)數(shù)目
LeetCode 1805.字符串中不同整數(shù)的數(shù)目
力扣題目鏈接:leetcode.cn/problems/nu…
給你一個(gè)字符串 word
,該字符串由數(shù)字和小寫英文字母組成。
請你用空格替換每個(gè)不是數(shù)字的字符。例如,"a123bc34d8ef34"
將會(huì)變成 " 123 34 8 34"
。注意,剩下的這些整數(shù)為(相鄰彼此至少有一個(gè)空格隔開):"123"
、"34"
、"8"
和 "34"
。
返回對(duì) word
完成替換后形成的 不同 整數(shù)的數(shù)目。
只有當(dāng)兩個(gè)整數(shù)的 不含前導(dǎo)零 的十進(jìn)制表示不同, 才認(rèn)為這兩個(gè)整數(shù)也不同。
示例 1:
輸入:word = "a123bc34d8ef34"
輸出:3
解釋:不同的整數(shù)有 "123"、"34" 和 "8" 。注意,"34" 只計(jì)數(shù)一次。
示例 2:
輸入:word = "leet1234code234"
輸出:2
示例 3:
輸入:word = "a1b01c001"
輸出:1
解釋:"1"、"01" 和 "001" 視為同一個(gè)整數(shù)的十進(jìn)制表示,因?yàn)樵诒容^十進(jìn)制值時(shí)會(huì)忽略前導(dǎo)零的存在。
提示:
1 <= word.length <= 1000
word
由數(shù)字和小寫英文字母組成
方法一:遍歷拆分
這個(gè)問題主要包括三部分:
- 將數(shù)字從字符串中抽取出來
- 將數(shù)字的前導(dǎo)零去除
- 數(shù)字的去重與計(jì)數(shù)
接下來逐個(gè)解決這三個(gè)問題
1. 將數(shù)字從字符串中提取出來:
我們需要一個(gè)布爾類型的變量“lastIsNum”來記錄上一個(gè)字符是否為數(shù)字。初始值為false
同時(shí),我們還需要一個(gè)字符串,用來存儲(chǔ)整個(gè)字符串中的某個(gè)數(shù)字。string thisString
接下來遍歷字符串。若字符串遍歷結(jié)束或者遍歷到字母字符時(shí),將lastIsNum
標(biāo)記為true
,否則將lastIsNum
標(biāo)記為false
如果這個(gè)字符是字母,但上一個(gè)字符是數(shù)字,那么就說明我們找到了“一個(gè)數(shù)字的末尾”,此時(shí)我們就提取出了這個(gè)數(shù)字。
處理完這個(gè)數(shù)字記得將字符串清空。
如果這個(gè)字符是數(shù)字,那么直接無腦添加數(shù)字字符串thisString
的末尾即可。
2. 將數(shù)字的前導(dǎo)零去除:
使用一個(gè)整數(shù)類型的變量firstLoc
來記錄一個(gè)數(shù)字第一個(gè)非零的位置,初始值為-1
接著遍歷數(shù)字字符串,遇到第一個(gè)非零數(shù)字就結(jié)束遍歷,并將firstLoc
修改為遍歷到的位置。
如果最后firstLoc
的值仍未-1,那么就說明整個(gè)數(shù)字字符串全是0
否則,從firstLoc
開始到字符串末尾所組成的子串即為去除前導(dǎo)零后的數(shù)字字符串
3. 數(shù)字的去重與統(tǒng)計(jì):
題目問的是“有多少不同的數(shù)字”,這就需要我們對(duì)所有的數(shù)字做去重處理。
這個(gè)過程很簡單,直接使用一個(gè)哈希表即可
將所有的處理過的數(shù)字字符串放入哈希表,最后返回哈希表的大小即為去重后的結(jié)果。
- 時(shí)間復(fù)雜度O(len(word))
- 空間復(fù)雜度O(len(word))
AC代碼
C++
class Solution { private: unordered_set<string> se; void insert(string toInsert) { int firstLoc = -1; for (int i = 0; i < toInsert.size(); i++) { if (toInsert[i] != '0') { firstLoc = i; break; } } if (firstLoc == -1) se.insert("0"); else se.insert(toInsert.substr(firstLoc)); } public: int numDifferentIntegers(string word) { bool lastIsNum = false; string thisString; int n = word.size(); for (int i = 0; i <= n; i++) { if (i == n || isalpha(word[i])) { if (lastIsNum) { lastIsNum = false; insert(thisString); thisString.clear(); } } else { thisString += word[i]; lastIsNum = true; } } return se.size(); } };
以上就是C++ LeetCode1805字符串不同整數(shù)數(shù)目的詳細(xì)內(nèi)容,更多關(guān)于C++ 字符串不同整數(shù)數(shù)目的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C字符串函數(shù)對(duì)應(yīng)的C++ string操作詳解
在本篇文章里小編給大家整理的是一篇關(guān)于C字符串函數(shù)對(duì)應(yīng)的C++ string操作知識(shí)點(diǎn)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。2020-01-01C++ BloomFilter布隆過濾器應(yīng)用及概念詳解
布隆過濾器是由布隆(Burton Howard Bloom)在1970年提出的 一種緊湊型的、比較巧妙的概率型數(shù)據(jù)結(jié)構(gòu),特點(diǎn)是高效地插入和查詢,可以用來告訴你 “某樣?xùn)|西一定不存在或者可能存在”,它是用多個(gè)哈希函數(shù),將一個(gè)數(shù)據(jù)映射到位圖結(jié)構(gòu)中2023-03-03C++ xxx_cast實(shí)現(xiàn)轉(zhuǎn)換代碼實(shí)例解析
這篇文章主要介紹了C++xxx_cast轉(zhuǎn)換代碼實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07C++如何實(shí)現(xiàn)簡單的計(jì)時(shí)器詳解
因?yàn)樽罱e著無聊就想著要不用C++寫點(diǎn)什么東西,仔細(xì)想了想其實(shí)自己的C++學(xué)的也不怎么好,寫個(gè)簡單的計(jì)時(shí)器吧!所以下面這篇文章主要介紹了利用C++如何實(shí)現(xiàn)簡單的計(jì)時(shí)器,需要的朋友可以參考借鑒,下面來一起看看吧。2017-01-01C++實(shí)現(xiàn)LeetCode(79.詞語搜索)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(79.詞語搜索),本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07解析C++中的虛擬函數(shù)及其靜態(tài)類型和動(dòng)態(tài)類型
虛擬函數(shù)(Visual Function)亦常被成為虛函數(shù),是C++中的一個(gè)重要特性,本文我們就來解析C++中的虛擬函數(shù)及其靜態(tài)類型和動(dòng)態(tài)類型2016-06-06