一、Python的知识
字典的使用:
1、创建:dict[key] = value
2、根据关键字提取相关值:
- value = dict[key] ——这种方法如果不存在相关key的话会返回错误
######## 判断key是否存在 if key in dict 这样 - value = dict.get(key, set_value)——如果不存在相关key,会返回设定值
3、字典的key只能使用不可变对象,字符串和整数是不可变对象,而list是可变对象,因此list不可作为key值:
再议不可变对象
上面我们讲了,str是不变对象,而list是可变对象。
对于可变对象,比如list,对list进行操作,list内部的内容是会变化的,比如:
a = [‘c’, ‘b’, ‘a’]
a.sort()
a
[‘a’, ‘b’, ‘c’]
而对于不可变对象,比如str,对str进行操作呢:
a = ‘abc’
a.replace(‘a’, ‘A’)
‘Abc’a
‘abc’
虽然字符串有个replace()方法,也确实变出了’Abc’,但变量a最后仍是’abc’,应该怎么理解呢?
我们先把代码改成下面这样:
a = ‘abc’
b = a.replace(‘a’, ‘A’)
b
‘Abc’a
‘abc’
要始终牢记的是,a是变量,而’abc’才是字符串对象!有些时候,我们经常说,对象a的内容是’abc’,但其实是指,a本身是一个变量,它指向的对象的内容才是’abc’:
a-to-str
当我们调用a.replace(‘a’, ‘A’)时,实际上调用方法replace是作用在字符串对象’abc’上的,而这个方法虽然名字叫replace,但却没有改变字符串’abc’的内容。相反,replace方法创建了一个新字符串’Abc’并返回,如果我们用变量b指向该新字符串,就容易理解了,变量a仍指向原有的字符串’abc’,但变量b却指向新字符串’Abc’了:
a-b-to-2-strs
所以,对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
摘自:廖雪峰的网站
4、取出dict的key和value:
for key, value in dict_count.iteritems()
二、 题目
描述:在数组中选出数目大于n/2的元素
思路:
1、我的思路比较简单,创建一个字典,key是相关元素,value是出现的次数,遍历返回大于n/2的key
class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
i = 0
dict_count = {}
while i < len(nums):
print i
if nums[i] in dict_count:
dict_count[nums[i]] += 1
else:
dict_count[nums[i]] = 1
i += 1
for key, value in dict_count.iteritems():
if value > len(nums)/2:
return int(key)
return None
2、排序:把列表中的元素按升序或者降序排列,返回中间值。排序的复杂度是nlogn,返回是1,因此这也是比较好的一种方法。
3、二分法:对于左右两边,分别计算,这样的复杂度是nlogn
class Solution(object):
def majorityElement(self, nums):
return self.major_devide(0, len(nums)-1, nums)
def major_devide(self, lo, hi, nums):
if lo == hi:
return nums[lo]
mid = (hi-lo)//2 + lo
left = self.major_devide(lo, mid, nums)
right = self.major_devide(mid+1, hi, nums)
if left == right:
return left
left_count = sum(1 for i in range(lo, hi+1) if nums[i] == left)
right_count = sum(1 for i in range(lo, hi+1) if nums[i] == right)
return left if right_count < left_count else right
4、二、摩尔投票算法:摩尔投票算法的时间和空间都很低,时间复杂度为O(n),空间复杂度为O(1),这也是选择遮盖算法的原因。算法原理:每次从数组中找出一对不同的元素,将它们从数组中删除,直到遍历完整个数组。由于这道题已经说明一定存在一个出现次数超过一半的元素,所以遍历完数组后数组中一定会存在至少一个元素。
算法在局部变量中定义一个序列元素(m)和一个计数器(i),初始化的情况下计数器为0;
算法依次扫描序列中的元素,当处理元素x的时候,如果计数器为0,那么将x赋值给m,然后将计数器(i)设置为1;
如果计数器不为0,那么将序列元素m和x比较,如果相等,那么计数器加1,如果不等,那么计数器减1。
处理之后,最后存储的序列元素(m),就是这个序列中最多的元素。
(如果不确定是否存储的元素m是最多的元素,还可以进行第二遍扫描判断是否为最多的元素)
class Solution(object):
def majorityElement(self, nums):
i_flag = nums[0]
i_count = 0
i = 0
while (i < len(nums)):
if i_count == 0:
i_flag = nums[i]
if nums[i] != i_flag:
i_count -= 1
else:
i_count += 1
i = i + 1
return i_flag
作者:yealxxy
来源:优快云
原文:https://blog.youkuaiyun.com/u014248127/article/details/79230221
版权声明:本文为博主原创文章,转载请附上博文链接!
#这些代码我都是后面补上补上