当前位置:   article > 正文

剑指offer—字符串专项python

剑指offer—字符串专项python

1 . 字符流中第一个不重复的字符

题目描述:

请实现一个函数用来找出字符流中第一个只出现一次的字符。例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g"。当从该字符流中读出前六个字符“google"时,第一个只出现一次的字符是"l"。

如果当前字符流没有存在出现一次的字符,返回#字符。

示例:

输入:‘google’

输出:‘ggg#ll'

解题思路:

最开始没读懂题意,以为直接读入一整个字符串’google‘,然后判断输出其中第一个不重复的字符 ’ l ' 。

但是输出的结果并不是一个字符,而是这样的‘ggg#ll' ,他的意思是g是第一次出现就一直输出g 直到第二个g出现的时候判断到它是重复所以输出#。然后开始输出 l 。

我们要判断一个字符出现的次数,要有一个 key 和 这个key出现的次数 正好满足python中字典的存储结构

例如 dict={ 'g' :2 , 'o':2 , 'l' : 1 }

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代码实现如下:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. def __init__(self):
  4. self.s=''
  5. self.dict={} #创建字典,key为读取的字符串中的每一个字符,val为每个字符出现的个数的计数值
  6. # 返回对应char
  7. def FirstAppearingOnce(self):
  8. # write code here
  9. for i in self.s: #遍历字符串s中的字符
  10. if self.dict[i]==1: #如果某个字符对应的计数为1,则返回该字符
  11. return i
  12. return '#' #在所有字符遍历完后,进行判断
  13. def Insert(self, char):
  14. # write code here
  15. self.s=self.s+char #从字符流中读入字符到字符串s中
  16. if char in self.dict:
  17. self.dict[char]=self.dict[char]+1 #如果读入的字符在字符串中已存在,在字典中对应的字符计数加一
  18. else:
  19. self.dict[char]=1 #如果读入的字符在字符串中不存在,则字典中对应的字符计数为一(即新增了一个新的字符)
  20. ###测试##test##
  21. if __name__=="__main__":
  22. s=Solution()
  23. for i in 'google':#循环读入字符流
  24. s.Insert(i)
  25. print(s.FirstAppearingOnce(),end='')#打印返回值

2 . 表示数值的字符串

题目描述:

请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。

解题思路:

看到题目第一想法就是分成几类,然后if判断,符合这几类就返回True,否则返回False,怎么分类,怎么判断,也就是常说的正则表达式可以干的事。关于正则表达式怎么用参考教程:python正则表达式

python代码实现如下:

  1. # -*- coding:utf-8 -*-
  2. import re
  3. class Solution:
  4. # s字符串
  5. def isNumeric(self, s):
  6. # write code here
  7. #正则表达式
  8. pattern = "^[-+]?\\d*(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?$"
  9. # pattern="^[\+\-]?[0-9]*(\.[0-9]*)?([eE][\+\-]?[0-9]+)?$"
  10. if re.match( pattern, s, re.M|re.I):
  11. return True
  12. return False
  13. ##测试
  14. if __name__=="__main__":
  15. s=Solution()
  16. print(s.isNumeric('+123'))

网上看到几个抖机灵的人才,想到的解这个题的办法,就是用float()函数,能够被转成浮点型的就是数值,否则就不是。

python代码实现如下:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. # s字符串
  4. def isNumeric(self, s):
  5. # write code here
  6. #正则表达式
  7. try:
  8. c=(float(s))
  9. print(s,'是数值')
  10. return True
  11. except ValueError as e:
  12. print(s,"不是数值")
  13. return False

3 . 正则表达式匹配

题目描述:

请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配

解题思路:

题目要实现正则表达式,那就直接采用 import re 在python中内置的库,非常轻松加愉快

python代码实现如下:

  1. # class Solution:
  2. # # s, pattern都是字符串
  3. # def match(self, s, pattern):
  4. # import re
  5. # pattern='^'+s+'$'
  6. # if re.match(pattern, s , re.M|re.I):
  7. # return True
  8. # return False
  9. # if __name__=="__main__":
  10. # s=Solution()
  11. # print(s.match_test('.a','aaa'))

4 . 替换空格

题目描述:

请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:

从头遍历这个字符串,发现有空格 将空格替换成%20 然后输出新生成的字符串。

python代码实现如下:

  1. # -*- coding:utf-8 -*-
  2. class Solution:
  3. # s 源字符串
  4. def replaceSpace(self, s):
  5. # write code here
  6. a='%20'
  7. str=''
  8. for i in s:
  9. if i==' ':
  10. i=a
  11. str=str+i
  12. return str

 

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/一键难忘520/article/detail/843631
推荐阅读
相关标签
  

闽ICP备14008679号