1. 程式人生 > >網易2017秋招程式設計題:迴文序列 [python]

網易2017秋招程式設計題:迴文序列 [python]

'''
[程式設計題] 迴文序列
時間限制:1秒
空間限制:32768K
如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:
{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),以空格分隔。




輸出描述:
輸出一個數,表示最少需要的轉換次數


輸入例子1:
4 1 1 1 3


輸出例子1:
2
'''



'''
解題思路:審題+遞迴
   審題:相鄰兩個數字之和放入數列的位置是這兩個數字中前一個數字的位置,比如 1 2 3 4 5 6, 如果合併1和2,
   那麼新數列是3 3 4 5 6
   思路:不斷比較第一個數和最後一個數,若其不相等,則用轉換操作調整第一個數和最後一個數,直至其相等
   遞迴:定義函式calc來計算所需要的運算元,calc函式以序列為輸入引數。
   1、比較輸入calc的序列的第一個和最後一個數,若相等,則把這兩個數踢出序列後把新序列再次輸入calc
   2、若第一個數大於最後一個數,則將第一個數和第二個數相加的和作為第一個數其餘的數不變作為新的序列輸入calc,此時計數+1
   3、若第一個數小於最後一個數,則將最後一個數和最後第二個數相加的和作最後一個數其餘的數不變作為新的序列輸入calc,此時計數+1
   4、序列的長度為0或1,則迭代結束
'''


'''
程式碼執行結果:
答案正確:恭喜!您提交的程式通過了所有的測試用例

'''

n = int(input())
digs = [int(each) for each in input().split()]


def calc(dig_list):
    length = len(dig_list)
    if length == 1 or length == 0:
        return 0
    else:
        if dig_list[0] == dig_list[-1]:
            return calc(dig_list[1:-1])
        elif dig_list[0] > dig_list[-1]:
            temp = dig_list[-1] + dig_list[-2]
            temp_list = dig_list[:-2]
            temp_list.append(temp)
            return 1 + calc(temp_list)
        else:
            temp = dig_list[0] + dig_list[1]
            temp_list = dig_list[1:]
            temp_list[0] = temp
            return 1 + calc(temp_list)

print(calc(digs))