前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >有趣的字符串面试题 --再探

有趣的字符串面试题 --再探

作者头像
iTesting
发布2019-10-29 16:23:40
2860
发布2019-10-29 16:23:40
举报
文章被收录于专栏:iTestingiTesting

iTesting,爱测试,爱分享

上次分享了一道有趣的字符串面试题,今天我们再重新审视下这道题,并借此机会了解下python库的强大。

上次的原题是这样的:

给定一个字符串,求字符串中连续相同的字符的个数, 例如给定字符串“abbcccdxt”,输出[‘a1’,’b2’,’c3’,’d1’,’x1’,’t1’]。

我原来的解决方法如下:

代码语言:javascript
复制
def count_s(s):

if len(s)<=0 or not isinstance(s, str):

return

base = s[0]

result = []

count = 1

for i in s[1:]:

if i == base:

count +=1

else:

result.append(base+str(count))

count =1

base = i

result.append(base + str(count))

return result

print(count_s('abbcccdxt'))

后来有同学在评论中指出,有更好的解决方案,我们使用下看看。

代码语言:javascript
复制
from collections import OrderedDict

def count_s(s):

if len(s)<=0 or not isinstance(s, str):

return

d = OrderedDict()

for _ in s:

if _ in d.keys():

d.update({_:d[_]+1})

else:

d.update({_: d.setdefault(_, 1)})

return list(map(lambda x: x +str(d[x]), d))

		

print(count_s('abbcccdxt'))

OrderedDict

The OrderedDict API is substantially the same as regular dictionaries but will iterate over keys and values in a guaranteed order depending on when a key was first inserted. If a new entry overwrites an existing entry, the original insertion position is left unchanged. Deleting an entry and reinserting it will move it to the end. Usage

代码语言:javascript
复制
d = OrderedDict()

d['parrot'] = 'dead'

d['penguin'] = 'exploded'

d.update({'foo': 'bar'})

print(d.items())

#output:

odict_items([('parrot', 'dead'), ('penguin', 'exploded')])

dict.setdefault(key, default=None)

如果字典中包含有给定键,则返回该键对应的值,否则返回为该键设置的值

map(function, iterable, …)

map() 会根据提供的函数对指定序列做映射。 第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表。

2。 上题我们来变形下,我要求得出如下结果 [‘aa’, ‘bb’, ‘ccc’, ‘d’, ‘x’, ‘t’]

代码语言:javascript
复制
from collections import OrderedDict

def count_s(s):

if len(s)<=0 or not isinstance(s, str):

return

d = OrderedDict()

for _ in s:

if _ in d.keys():

d.update({_:d[_]+1})

else:

d.update({_: d.setdefault(_, 1)})

return list(map(lambda x: d[x]*x, d))

print(count_s('abbcccdxt'))

3。 我们再变下,求字符串中连续相同个数是3的字符,比如打印出‘ccc’。‘bb’由于字符数2个相同不打印出

代码语言:javascript
复制
from collections import OrderedDict

def count_s(s):

if len(s)<=0 or not isinstance(s, str):

return

d = OrderedDict()

for _ in s:

if _ in d.keys():

d.update({_:d[_]+1})

else:

d.update({_: d.setdefault(_, 1)})

return list(map(lambda x: x*d[x],filter(lambda x: True if d[x]==3 else False , d)))

print(count_s('abbcccdxt'))

filter(function, iterable)

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。 该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

4。 最后,再来“作”一下,我现在不要求连续相同了,我要求得出字符串中所有3个字符的重复个数,比如字符串“abccbbcc”,我们会得到’abc’, ‘bcc’, ‘ccb’, ‘cbb’, ‘bbc’, ‘bcc’这些长度为3的字符,其中“bcc”出现2次,其它都出现一次。我们要实现它。

代码语言:javascript
复制
from collections import Counter

def count_s(s):

if len(s)<=0 or not isinstance(s, str):

return

return [s[number:number+3] for number in range(len(s)-2)]

print(Counter(count_s('abccbbcc')))

这个题目,有各种变形,比如我现在要求出字符串的所有子集, 例如 给你‘123’我要得到[[‘1’], [‘2’], [‘3’], [‘1’, ‘2’], [‘2’, ‘3’], [‘1’, ‘2’, ‘3’]]

代码语言:javascript
复制
def count_s(s):

if len(s) <= 0 or not isinstance(s, str):

return

r = []

for i in range(len(s)):

for item in [s[number:number + i+1] for number in range(len(s) - i)]:

r.append(list(item))

return r

print((count_s('123')))

怎么样,这一圈下来明白python的标准库有多强大了吧, 作为一个pythoner,一定要足够pythonic.

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 iTesting 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 给定一个字符串,求字符串中连续相同的字符的个数, 例如给定字符串“abbcccdxt”,输出[‘a1’,’b2’,’c3’,’d1’,’x1’,’t1’]。
  • 2。 上题我们来变形下,我要求得出如下结果 [‘aa’, ‘bb’, ‘ccc’, ‘d’, ‘x’, ‘t’]
  • 3。 我们再变下,求字符串中连续相同个数是3的字符,比如打印出‘ccc’。‘bb’由于字符数2个相同不打印出
  • 4。 最后,再来“作”一下,我现在不要求连续相同了,我要求得出字符串中所有3个字符的重复个数,比如字符串“abccbbcc”,我们会得到’abc’, ‘bcc’, ‘ccb’, ‘cbb’, ‘bbc’, ‘bcc’这些长度为3的字符,其中“bcc”出现2次,其它都出现一次。我们要实现它。
  • 这个题目,有各种变形,比如我现在要求出字符串的所有子集, 例如 给你‘123’我要得到[[‘1’], [‘2’], [‘3’], [‘1’, ‘2’], [‘2’, ‘3’], [‘1’, ‘2’, ‘3’]]
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档