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

# -*- coding:utf-8 -*-
class Solution:
    def __init__(self):
        self.s=''
        self.dict={} #创建字典,key为读取的字符串中的每一个字符,val为每个字符出现的个数的计数值
    # 返回对应char
    def FirstAppearingOnce(self):
        # 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)
        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代码实现如下:

# -*- 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”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。

解题思路:

从头遍历这个字符串,发现有空格 将空格替换成%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=a
            str=str+i
        return str

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

璃墟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值