开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情
今天继续Codility的Lessons部分的第二个主题——Arrays部分
还是按照先总结红色部分的PDF,然后讲解下我是怎么完成Tasks部分来进行:
PDF Reading Material(PDF)
PDF里一共是6部分内容,简单概括如下:
- Creating an array:使用Python的list结构,创建Array的两种方式([1,2,3]和[0]*6),以及list里面可以放int,string等任何类型的数据
- Accessing array values:介绍了Array的index的概念,继而推及用index来访问Array元素的方法
- Modifying array values:介绍了Python中修改某个index下的元素值,和在list的最后新增一个元素值的方法
- Iterating over an array:介绍了“循环访问Array的index,循环直接访问Array中元素”的两种循环方式
- Basic Array operations:介绍了针对Python list的以下四种操作:len()、*,+,in
- Exercise:将list中的元素倒置,答案思路是从index=0循环到index=N//2,然后依次更换两个位置的元素
感兴趣的朋友可以自己点开上方链接查看~
Tasks
Task1: CyclicRotation
简单概括:输入是【Array A】和【自然数K】,输出是“Array A顺时针旋转元素K次后”的Array结果,重点是Correctness,Efficiency不作为评估标准。
我的大概思路如下:先用K和len(A)取余,算出真正需要rotate的次数new_K;再根据new_K,一次性重新拼接出旋转后的Array A
def solution(A, K):
# Implement your solution here
# 将K与A的长度取余,得到真正需要的rotate次数new_K
len_A = len(A)
new_K = K % len_A
# 根据new_K拆分Array,并重新拼接
A[:new_K], A[new_K:] = A[len_A-new_K:], A[:len_A-new_K]
return A
提交结果为Correctness=87%,仔细看了下发现是对于空Array,直接会在取余时报错:
于是修改了下代码,最终结果实现了100%的Correctness
def solution(A, K):
# Implement your solution here
# 将K与A的长度取余,得到真正需要的rotate次数new_K
len_A = len(A)
if len_A==0:
return A
new_K = K % len_A
# 根据new_K拆分Array,并重新拼接
A[:new_K], A[new_K:] = A[len_A-new_K:], A[:len_A-new_K]
return A
Task2:OddOccurencesInArray
简单概括,输入是A,一个含有至少1个元素的奇数元素list,并且其中除了唯一一个元素外,其他元素都是成对相同的,而最终需要输出的,是A里无法成对的唯一元素。比如A=[1,2,3,2,1],那么需要返回的就是3。
另外本题强调的是efficiency,也就是performance会作为最终评价报告的一部分。因此选择通过dict数据结构来实现这个Solution:
def solution(A):
# Implement your solution here
# 循环A中的元素,在dict结构里进行出现次数的加总记录
count_dict = {}
for a in A:
count_dict[a] = count_dict.get(a,0) + 1
# 迭代count_dict的key和value,直接返回value为奇数的第一个key
for k,v in count_dict.items():
if v%2==1:
return k
最终结果Correctness 100%,Performance 100%,完美~