Codility刷题之旅 - Arrays

395 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 2 天,点击查看活动详情

今天继续Codility的Lessons部分的第二个主题——Arrays部分

Codility - Lessons - Arrays

还是按照先总结红色部分的PDF,然后讲解下我是怎么完成Tasks部分来进行:

image.png

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

image.png

简单概括:输入是【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 

image.png

提交结果为Correctness=87%,仔细看了下发现是对于空Array,直接会在取余时报错:

image.png

于是修改了下代码,最终结果实现了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 

image.png

Task2:OddOccurencesInArray

image.png

简单概括,输入是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%,完美~

image.png