劍指offer 字串專項python

2021-10-06 04:26:56 字數 4146 閱讀 2846

1 . 字元流中第乙個不重複的字元

題目描述:

請實現乙個函式用來找出字元流中第乙個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第乙個只出現一次的字元是"g"。當從該字元流中讀出前六個字元「google"時,第乙個只出現一次的字元是"l"。

如果當前字元流沒有存在出現一次的字元,返回#字元。

示例:輸入:『google』

輸出:『ggg#ll'

解題思路:

最開始沒讀懂題意,以為直接讀入一整個字串』google『,然後判斷輸出其中第乙個不重複的字元 』 l ' 。

但是輸出的結果並不是乙個字元,而是這樣的『ggg#ll' ,他的意思是g是第一次出現就一直輸出g 直到第二個g出現的時候判斷到它是重複所以輸出#。然後開始輸出 l 。

我們要判斷乙個字元出現的次數,要有乙個 key 和 這個key出現的次數 正好滿足python中字典的儲存結構

例如 dict=

key 表示的是字元流中的字元char, key 的值 即dict[key]為char出現的次數。

我們將每乙個字元出現的次數計數,怎麼計數呢,通過新建字典dict = ,字典dict[char]的值來計數,我們遍歷字典  if 判斷字元char是否出現過, 如果出現過,也就是char 在dict 中,則 dict[char]+1, 如果沒有出現過,證明他是第一次出現 令dict[char] = 1,然後我們通過新建乙個空字串 s= ' ',讀入字元流中每乙個字元到字串中  即 s = 『 google ' 。遍歷整個字元 判斷dict[ s[i] ]是否為 1.在字典中第乙個dict[ s[i] ]的值為 1 的 s[i] 這個字元就是第一次出現的沒重複的字元,return即可,如果遍歷結束也沒有dict[ s[i] ]的值為 1 ,return 』#『 即可。

python**實現如下:

# -*- coding:utf-8 -*-

class solution:

def __init__(self):

self.s=''

self.dict={} #建立字典,key為讀取的字串中的每乙個字元,val為每個字元出現的個數的計數值

# 返回對應char

# write code here

for i in self.s: #遍歷字串s中的字元

if self.dict[i]==1: #如果某個字元對應的計數為1,則返回該字元

return i

return '#' #在所有字元遍歷完後,進行判斷

def insert(self, char):

# write code here

self.s=self.s+char #從字元流中讀入字元到字串s中

if char in self.dict:

self.dict[char]=self.dict[char]+1 #如果讀入的字元在字串中已存在,在字典中對應的字元計數加一

else:

self.dict[char]=1 #如果讀入的字元在字串中不存在,則字典中對應的字元計數為一(即新增了乙個新的字元)

###測試##test##

if __name__=="__main__":

s=solution()

for i in 'google':#迴圈讀入字元流

s.insert(i)

2 . 表示數值的字串

題目描述:

請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1e-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

解題思路:

看到題目第一想法就是分成幾類,然後if判斷,符合這幾類就返回true,否則返回false,怎麼分類,怎麼判斷,也就是常說的正規表示式可以幹的事。關於正規表示式怎麼用參考教程:python正規表示式。

python**實現如下:

# -*- coding:utf-8 -*-

import re

class solution:

# s字串

def isnumeric(self, s):

# write code here

#正規表示式

pattern = "^[-+]?\\d*(?:\\.\\d*)?(?:[ee][+\\-]?\\d+)?$"

# pattern="^[\+\-]?[0-9]*(\.[0-9]*)?([ee][\+\-]?[0-9]+)?$"

if re.match( pattern, s, re.m|re.i):

return true

return false

##測試

if __name__=="__main__":

s=solution()

print(s.isnumeric('+123'))

網上看到幾個抖機靈的人才,想到的解這個題的辦法,就是用float()函式,能夠被轉成浮點型的就是數值,否則就不是。

python**實現如下:

# -*- coding:utf-8 -*-

class solution:

# s字串

def isnumeric(self, s):

# write code here

#正規表示式

try:

c=(float(s))

print(s,'是數值')

return true

except valueerror as e:

print(s,"不是數值")

return false

3 . 正規表示式匹配

題目描述:

請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

解題思路:

題目要實現正規表示式,那就直接採用 import re 在python中內建的庫,非常輕鬆加愉快

python**實現如下:

# class solution:

# # s, pattern都是字串

# def match(self, s, pattern):

# import re

# pattern='^'+s+'$'

# if re.match(pattern, s , re.m|re.i):

# return true

# return false

# if __name__=="__main__":

# s=solution()

# print(s.match_test('.a','aaa'))

4 . 替換空格

題目描述:

解題思路:

從頭遍歷這個字串,發現有空格 將空格替換成%20 然後輸出新生成的字串。

python**實現如下:

# -*- coding:utf-8 -*-

class solution:

# s 源字串

def replacespace(self, s):

# write code here

a='%20'

str=''

for i in s:

if i==' ':

i=astr=str+i

return str

劍指offer 字串

問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...

劍指offer 字串

問題描述 function replacespace str 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含 0 次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a...

劍指offer 字串

請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a 匹配,但是與 aa.a 和 ab a 均不匹配 解這題需要把題意仔細研究清...