【Python】 易笔试编程题(回文序列)

题目描述

如下是网易17年秋招编程题里的题目


如果一个数字序列逆置之后跟原序列是一样的就称这样的数字序列为回文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是回文序列,
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是回文序列。
现在给出一个数字序列,允许使用一种转换操作:
选择任意两个相邻的数,然后从序列移除这两个数,并用这两个数字的和插入到这两个数之前的位置(只插入一个和)。
现在对于所给序列要求出最少需要多少次操作可以将其变成回文序列。

输入描述:

输入为两行,第一行为序列长度n ( 1 ≤ n ≤ 50)
第二行为序列中的n个整数item[i]  (1 ≤ iteam[i] ≤ 1000),以空格分隔。

输出描述:

输出一个数,表示最少需要的转换次数

输入例子:

4
1 1 1 3

输出例子:

2



思路及Python实现


粗看此题可能会不知所措,但题目要求的是求出最少所需的转换次数,这便是我们的一个突破点。

1.首先判断首尾是否相等,如相等则删掉简化后再进行处理

        if li[0] == li[last]:
            del li[last]   #先删除最后一个,再删除第一个
            del li[0]      #否则就应为del li[0],del li[last-1]
            count = dealhw(li,count)

2.不相等则判断首尾大小,总是将小的排在最前

        if li[0]>li[last]:
            li.reverse()         #将最小的放在最前
        li[0]=li[0]+li[1]
        del li[1]
        count+=1

3.返回第一步,递归处理

	count=dealhw(li,count)   #递归处理

OK,最后照例附上Python实现

#encoding:utf-8
def dealhw(li,count=0):
    leng = len(li)
    if leng > 1:
        last = leng-1
        if li[0] == li[last]:
            del li[last]   #先删除最后一个,再删除第一个
            del li[0]      #否则就应为del li[0],del li[last-1]
            count = dealhw(li,count)
        else:
            if li[0]>li[last]:
                li.reverse()         #将最小的放在最前
            li[0]=li[0]+li[1]
            del li[1]
            count+=1
            count=dealhw(li,count)   #递归处理
    return count

num = input()
li  = raw_input().split()
li = [int(li[i]) for i in range(int(num))]
print(dealhw(li))


更多样例

更多样例请看这里哟:http://blog.csdn.net/buracag_mc/article/category/6817874



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值