leetcode初級(jí)算法|字符串

反轉(zhuǎn)字符串

2021-03-24

編寫一個(gè)函數(shù)瞻想,其作用是將輸入的字符串反轉(zhuǎn)過來谦炒。輸入字符串以字符數(shù)組 char[] 的形式給出。
不要給另外的數(shù)組分配額外的空間,你必須原地修改輸入數(shù)組、使用 O(1) 的額外空間解決這一問題。
你可以假設(shè)數(shù)組中的所有字符都是 ASCII 碼表中的可打印字符捉片。

方法一:切片、reverse

s.reverse()
s = s[::-1]

方法二:雙指針汞舱,對(duì)稱交換

    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        n = len(s)
        for i in range(n//2):
            s[i],s[n-1-i] = s[n-1-i],s[i]

整數(shù)反轉(zhuǎn)

2021-03-24

給你一個(gè) 32 位的有符號(hào)整數(shù) x 伍纫,返回將 x 中的數(shù)字部分反轉(zhuǎn)后的結(jié)果。
如果反轉(zhuǎn)后整數(shù)超過 32 位的有符號(hào)整數(shù)的范圍 [?2^31, 2^31 ? 1] 昂芜,就返回 0莹规。
假設(shè)環(huán)境不允許存儲(chǔ) 64 位整數(shù)(有符號(hào)或無符號(hào))。
先反轉(zhuǎn)數(shù)泌神,再判斷數(shù)是否在范圍內(nèi)良漱。

方法一:將x%10,放到數(shù)組中欢际,然后再組合起來母市。

    def reverse(self, x: int) -> int:
        a = 1
        if x < 0:
            x = -x
            a = -1
        result = 0
        while x > 0:
            result = result*10 + x%10
            x = x//10
        result = result * a
        if result < -2**31 or result > 2**31-1:
            return 0
        return result

方法二:整數(shù)轉(zhuǎn)字符串,字符串反轉(zhuǎn)损趋。

    def reverse(self, x: int) -> int:
        a = str(x)
        if a[0] == '-':
            # a[1:][::-1] 先取從除首位以外的數(shù)患久,然后反轉(zhuǎn)
            result = '-' + a[1:][::-1]
        else:
            result = a[::-1]
        result = int(result)
        if result < -2 ** 31 or result > 2 ** 31 - 1:
            return 0
        return result

字符串中的第一個(gè)唯一字符

2021-03-25

給定一個(gè)字符串,找到它的第一個(gè)不重復(fù)的字符,并返回它的索引蒋失。如果不存在返帕,則返回 -1。

解法:遍歷字符高镐,記錄每個(gè)字符出現(xiàn)的次數(shù)到字典中溉旋。再遍歷字典,如果值為1嫉髓,則key為第一個(gè)唯一字符观腊。返回該字符的位置。

    def firstUniqChar(self, s: str) -> int:
        sd = dict()
        for i in range(len(s)):
            sd[s[i]] = sd.get(s[i], 0)+1
        for i,key in enumerate(sd):
            if sd[key] == 1:
                return i

        return -1

有效的字母異位詞

2021-03-26

給定兩個(gè)字符串 st 算行,編寫一個(gè)函數(shù)來判斷 t 是否是 s 的字母異位詞梧油。

方法一:統(tǒng)計(jì)每個(gè)字符串中字符出現(xiàn)的次數(shù)

    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False
        fre_s = collections.Counter(s)
        fre_t = collections.Counter(t)

        return fre_s == fre_t

方法二:兩個(gè)字符串排序,然后看兩個(gè)字符串是否一樣

    def isAnagram(self, s: str, t: str) -> bool:
        if len(s) != len(t):
            return False
        sa = list(s)
        st = list(t)
        sa.sort()
        st.sort()
        for i in range(len(s)):
            if sa[i] != st[i]:
                return False
        return True

驗(yàn)證回文串

2021-03-26

給定一個(gè)字符串州邢,驗(yàn)證它是否是回文串儡陨,只考慮字母和數(shù)字字符,可以忽略字母的大小寫量淌。

方法一:雙指針骗村。一個(gè)從前向后一個(gè)從后向前,遇到非字母呀枢、數(shù)字就跳過胚股。如果兩個(gè)指針?biāo)傅淖址坏龋瑒t不是回文裙秋。

    def isPalindrome(self, s: str) -> bool:
        s= s.lower()
        start = 0
        end = len(s)-1
        while start < end:
            if not (s[start].isalpha() or s[start].isdigit()):
                start += 1
                continue
            if not (s[end].isalpha() or s[end].isdigit()):                
                end -= 1
                continue
            if s[start] != s[end]:
                return False
            start += 1
            end -= 1
        return True

字符串轉(zhuǎn)換整數(shù) (atoi)

2021-03-28

請(qǐng)你來實(shí)現(xiàn)一個(gè) myAtoi(string s) 函數(shù)琅拌,使其能將字符串轉(zhuǎn)換成一個(gè) 32 位有符號(hào)整數(shù)(類似 C/C++ 中的 atoi 函數(shù))。

解法:
1摘刑、去掉前置空格
2进宝、判斷是正數(shù)還是負(fù)數(shù)
3、獲取數(shù)字
4枷恕、判斷數(shù)字大小是否超過范圍

    def myAtoi(self, s: str) -> int:
        s = s.lstrip()
        if len(s) == 0:
            return 0
        res = 0
        a = 1
        index = 0
        if s[index] == '-':
            a = -1
            index += 1
        elif s[index] == '+':
            a= 1
            index += 1
        while index < len(s):
            if s[index].isdigit():
                res = res*10 + int(s[index])
            else:
                break
            index += 1
        res = res*a
        if res < -2**31:
            res = -2**31
        elif res > 2**31-1:
            res = 2**31-1
        return res

實(shí)現(xiàn) strStr()

2021-03-28

給定一個(gè) haystack 字符串和一個(gè) needle 字符串党晋,在 haystack 字符串中找出 needle 字符串出現(xiàn)的第一個(gè)位置 (從0開始)。如果不存在徐块,則返回 -1隶校。

解法:雙指針。一個(gè)遍歷字符A蛹锰,一個(gè)遍歷字符B。如果A[index1]等于B[index2]绰疤,兩個(gè)指針各加1铜犬。如果不相等,index1回到從相等處+1的位置,index2重置為0.

    def strStr(self, haystack: str, needle: str) -> int:
        if len(needle) == 0:
            return 0
        if len(haystack) < len(needle):
            return -1
        index1 = 0
        index2 = 0
        while index1 < len(haystack) and index2 < len(needle):
            if haystack[index1] == needle[index2]:
                index1 += 1
                index2 += 1
            else:
                index1 = index1 - index2 +1
                index2 = 0
        if index2 == len(needle):
            return index1 - index2
        return -1

外觀數(shù)列

2021-03-29

給定一個(gè)正整數(shù) n 癣猾,輸出外觀數(shù)列的第 n 項(xiàng)敛劝。
「外觀數(shù)列」是一個(gè)整數(shù)序列,從數(shù)字 1 開始纷宇,序列中的每一項(xiàng)都是對(duì)前一項(xiàng)的描述夸盟。
你可以將其視作是由遞歸公式定義的數(shù)字字符串序列:

解法:雙指針。

    def countAndSay(self, n: int) -> str:
        num = '1'
        for i in range(1, n):
            index = 0
            count = 0
            cur = num[0]
            now = ''
            while index < len(str(num)):
                if cur == num[index]:
                    count += 1
                else:
                    now += str(count)
                    now += cur
                    cur = num[index]
                    count = 1
                index += 1
            now += str(count)
            now += cur
            num = now
        return num

最長公共前綴

2021-03-29

編寫一個(gè)函數(shù)來查找字符串?dāng)?shù)組中的最長公共前綴像捶。
如果不存在公共前綴上陕,返回空字符串 ""。

解法:將strs[0]作為前綴拓春,然后和之后的每一個(gè)字符做比較释簿。遇到不一樣的字符,則將當(dāng)前位置作為前綴的長度硼莽。若長度為0庶溶,則不存在公共前綴。

    def longestCommonPrefix(self, strs: List[str]) -> str:
        if len(strs) == 0:
            return ""
        length = len(strs[0])
        for i in range(1, len(strs)):
            j = 0
            while j < length and j < len(strs[i]):
                if strs[0][j] != strs[i][j]:
                    length = j
                    break
                j += 1
            length = min(length, len(strs[i]))
            if length == 0:
                return ""
        return strs[0][:length]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懂鸵,一起剝皮案震驚了整個(gè)濱河市偏螺,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌匆光,老刑警劉巖套像,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異殴穴,居然都是意外死亡凉夯,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門采幌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來劲够,“玉大人,你說我怎么就攤上這事休傍≌饕铮” “怎么了?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵磨取,是天一觀的道長人柿。 經(jīng)常有香客問我,道長忙厌,這世上最難降的妖魔是什么凫岖? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮逢净,結(jié)果婚禮上哥放,老公的妹妹穿的比我還像新娘歼指。我一直安慰自己,他們只是感情好甥雕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布踩身。 她就那樣靜靜地躺著,像睡著了一般社露。 火紅的嫁衣襯著肌膚如雪挟阻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天峭弟,我揣著相機(jī)與錄音附鸽,去河邊找鬼。 笑死孟害,一個(gè)胖子當(dāng)著我的面吹牛拒炎,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挨务,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼击你,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了谎柄?” 一聲冷哼從身側(cè)響起丁侄,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎朝巫,沒想到半個(gè)月后鸿摇,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡劈猿,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拙吉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揪荣。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡筷黔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出仗颈,到底是詐尸還是另有隱情佛舱,我是刑警寧澤,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布挨决,位于F島的核電站请祖,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏脖祈。R本人自食惡果不足惜肆捕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望盖高。 院中可真熱鬧福压,春花似錦掏秩、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽映凳。三九已至胆筒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诈豌,已是汗流浹背仆救。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留矫渔,地道東北人彤蔽。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像庙洼,于是被迫代替她去往敵國和親顿痪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

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