搜狐集团2018秋季校招笔试题 kolakoski序列

这里写图片描述这里写图片描述这里写图片描述

python实现代码:

#code:utf-8
import sys
if __name__=="__main__":
    inputVal=raw_input()
    count=int(inputVal.split()[0]) #结果输出多少行数
    n=int(inputVal.split()[1])
    myList=list(map(int,raw_input().split()))#存放n个值
    resList=[]#存放kolakoski序列
    sumLen=1
    k=1
    #第一次肯定是myList[0]个myList[0]的值
    index=myList[0]
    for i in xrange(index):
            resList.append(myList[0])
    while(k<count):
        index=resList[k]
        for i in xrange(index):
            resList.append(myList[sumLen])
        sumLen=sumLen+1
        k=k+1
        if(sumLen%n==0):  #myList长度为n
            sumLen=0
    #print ("len:%d" %(len(resList)))
    for x in xrange(count):
        print (resList[x])

结果如图:
这里写图片描述

解题思路:

kolakoski序列有如下规律:
1、如输入3 1 4 1
2、kolakoski序列为333111444131444411113333141….
2.1、 首先kolakoski的第一个值肯定是3,即resList[0]=myList[0]
2.2、 第一趟:resList需加入3个myList[0]
2.3 、然后查找resList[1],需要加入resList[1]个myList[1]的值到resList
2.4、 然后查找resList[2],需要加入resList[2]个myList[2]的值到resList
2.5、最后查找resList[i],需要加入resList[i]个myList[i%4] (因为myList最大长度为4,每次循环完后,从0开始又循环)的值到resList
2.6、最后输出resList[0]到resList[count-1]的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值