这道题是剑指offer中的35题,也是一道经典的面试题。
str = "ssssaaaccddsadasf"
使用两层for循环遍历,直到遇到只出现一次的字符返回该字符
def methond1(str):
len_str = len(str)
for i in range(len_str):
count = 0
for j in range(len_str):
if str[j] == str[i]:
count += 1
if count == 1:
return str[i]
使用一层for循环,统计某字符出现的所有次数,并按其出现的先后顺序记录在列表中
def methond2(str):
counts = {}
order = []
for s in str:
if s in counts:
counts[s] +=1
else:
counts[s] = 1
order.append(s)
for i in order:
if counts[i] == 1:
return i
同一种方法的另外一种写法
def FirstNotRepeatingChar(self, s):
dict = {}
for ele in s:
dict[ele] = 1 if ele not in dict else dict[ele] + 1
for i in range(len(s)):
if dict[s[i]] == 1:
return i
return -1
使用内置的count 函数
def methond3(str):
for s in str:
if str.count(s) == 1:
return s,str.index(s)
如果将这个问题进行扩展,可扩展为:在一个字符串中找到第一个只出现N次的字符,假设N=2
只需将上方的代码做稍微的改动即可
def methond1_n(str):
len_str = len(str)
for i in range(len_str):
count = 0
for j in range(len_str):
if str[j] == str[i]:
count += 1
if count == 2:
return str[i]
def methond2_n(str):
counts = {}
order = []
for s in str:
if s in counts:
counts[s] +=1
else:
counts[s] = 1
order.append(s)
for i in order:
if counts[i] == 2:
return i
def methond3_n(str):
for s in str:
if str.count(s) == 2:
return s
若将其做进一步的扩展:在一个字符串中找到第M个只出现N次的字符,假设M=3 N=2
def methond1_mn(str):
for i in range(len(str)):
count = 0
m = 0
for j in range(len(str)):
if str[i] == str[j]:
count += 1
if count == 2:
if m == 2:
return str[i]
else:
m+=1