判断句子中的有效单词数。
题目比较简单,将句子拆分成单词,然后判断单词是否有效。
但是“有效”条件有点繁琐:
如果一个 token 同时满足下述条件,则认为这个 token 是一个有效单词:
1.不含数字
2.至多一个 连字符 '-' 。如果存在,连字符两侧应当都存在小写字母("a-b" 是一个有效单词,但 "-ab" 和 "ab-" 不是有效单词)。
3.至多一个 标点符号。如果存在,标点符号应当位于 token 的 末尾 。
官方题解:
class Solution: def countValidWords(self, sentence: str) -> int: def valid(s): hasHyphens = False for i, ch in enumerate(s): if ch.isdigit() or ch in "!.," and i < len(s)-1: return False if ch == '-': if hasHyphens or i==0 or i== len(s)-1 or not s[i-1].islower() or not s[i+1].islower(): return False hasHyphens = True return True return sum(valid(s) for s in sentence.split())
自己写的:
前几遍没过,容易漏条件。
class Solution: def countValidWords(self, sentence: str) -> int: tokens = sentence.split() count = 0 print(tokens) for token in tokens: istoken = True hasHyphens = False for i,x in enumerate(token): if x.isdigit(): istoken = False break if x in "!.," and i != len(token)-1: istoken = False break if x == '-': if hasHyphens or i==0 or i== len(token)-1 or not token[i-1].islower() or not token[i+1].islower(): istoken = False break hasHyphens = True if istoken and token: count += 1 return count
补充:
学到的三个简化代码方法:
一、enumerate(iterable,start=0)返回一个枚举对象,里面包含一个计数值和迭代对象iterable生成的值。
该方法等价于:
def enumerate(sequence, start=0): n = start for elem in sequence: yield n, elem n += 1
二、sum
(iterable, /, start=0) 也可以对[True,True,False]这样布尔类型求和,返回其中True个数。
从 start 开始自左向右对 iterable 的项求和并返回总计值。 iterable 的项通常为数字,而 start 值则不允许为字符串。
三、用 in 代替多个== or == or ==
如: ch in "!.,"
x in [1,3,5],