总结:
--这个题目大的方向有三种解法,其中hash是查找最为常用的方法
通过牺牲空间,获取时间,hash的查找有很好的性质,在数据量
没有过大时,可以看作o(1)操作
--fun3()中的list查找可以在下次查找字符时,使用
--求和,也是针对于ascii的性质来的
--位运算 异或运算,在查找中也经常使用,适用于
元素出现了偶数次的,其他出现了奇数次,那么就
可以找到他
https://www.runoob.com/w3cnote/bit-operation.html
关于位运算的操作
总体来说,代码的实现复杂度不高.注重思想就好
这种方法,提交并没有通过,原因在于,可能会添加重复元素,所以不能简单的判断,是否 存在
def fun1(s,t):
#看到了查找两个字,首先的想法hash表
dic={}
for i in s:
dic[i]=0
for j in t:
if j not in dic:
return j
#提交错误,原因在于没有想到可能添加重复元素 如s=a t=aa
上面方法的改进,除了判断是否存在,还进行了删除操作,判断当前是否是多出的
def fun2(s,t):#计数解法(对每个字符出现次数进行记录)
# 对于fun1的解决方式
#对于出现次数进行记录,然后在合适的时候减去
dic = {}
for i in s:
dic[i] = dic.get(i, 0) + 1
for j in t:
if j not in dic or dic[j] == 0:
return j
else:
dic[j] = dic.get(j, 0) - 1
#其实我的重点是什么,是记录每个数字出现的次数,这样不一定是需要hash
与hash表记录,本质上没什么区别,绝大多数时候使用的都是hash,但偶尔也可使用list,在其具有很好的性质的时候
def fun3(s,t):
'''
chr(32) ascii转字符
ord('a') 字符转对应的ascii
:param s:
:param t:
:return:
'''
ls=[0]*26 #开辟空间,存放数字
print(ls)
jishu=ord('a')
print(ord('z'))
for i in s:
ls[ord(i)-jishu]+=1
for i in t:
ls[ord(i)-jishu]-=1
if ls[ord(i)-jishu]<0:
return i
进行求和操作,每一个字符都会有对应的ascii(unicode)码,是一个数字
那么可以分别对s和t求和,用t的和-s的和这样得到的结果就是多出的元素
def fun4(s,t):
#字符串求和
#多出来的那一部分就是多出来的
sum_1=0
sum_2=0
for i in s:
sum_1+=ord(i)
for j in t:
sum_2+=ord(j)
return chr(sum_2-sum_1)
位运算,这个是很常用的异或(相同为0,不同为1)
def fun5(s,t):
#位运算
#异或运算 对应位相同为0,不同为1 0与任何数做异或该数不变
# (那么两个相同元素异或,对应位都相同 结果为0)
#可以知道,除了插入字符,其他均出现偶数次(s,t合起来)
eor=0
for i in s:
eor^=ord(i)
for i in t:
eor^=ord(i)
return chr(eor)