Python笔试题记录——序列类题目自记

最长递增子序列(LCS)

给定一个序列 An = a1 ,a2 ,  ... , an ,找出最长的子序列使得对所有 i < j ,ai < aj 。求出这个子序列的长度

思路自记

这个题的思路我原来理解的是,子序列就不能有断啊,但这道题就是在一个序列中,所有的数,只要能排成个递增子序列的都算。

这道题相比于动态规划的难度小,就在于递增子序列,跟序列的第一个值密切相关,换句话说,第一个值决定了整个序列能排多长,那么,我只要对每一个值都作为一个序列的首值来排列,就可以得到了所有的情况,那么对应序列长度最长的,就是答案。

for i in range(len(arr)):
    tmp = arr[i]
    num = 1
    for j in range(i+1,len(arr)):
        if tmp < arr[j]:
            num += 1
            maxval = max(num, maxval)
            tmp = arr[j]

最后,还要考虑一种情况就是当输入序列数原本就只有1的情况下,那么输出也是1,但这种思路和上面的不适用,需要另外设置一下:

if len(arr) == 1:
    print '1'
else:
    print maxval

完整代码

arr = map(int, raw_input().split(' '))
num = 1
maxval = 0

for i in range(len(arr)):
    tmp = arr[i]
    num = 1
    for j in range(i+1,len(arr)):
        if tmp < arr[j]:
            num += 1
            maxval = max(num, maxval)
            tmp = arr[j]
if len(arr) == 1:
    print '1'
else:
    print maxval

 

 

最大子序列


输入包括一行,一个字符串s,字符串s长度length(1 ≤ length ≤ 50)。s中每个字符都是小写字母。输出一个字符串,即字典序最大的s的子序列。

思路自记

我刚开始理解的时候,特别费解,如果要字典序最大的子序列,那我直接就把原始输入序列给保留了,那不就是最大的吗?后来,才明白,他也是想要一种最大字典序递增的排序,那思路就是,我先从原始序列中找到当前出现的字典序最长的元素,保留,再从这个元素后到整个序列结尾,再找字典序最大的,一直这样,直到把序列给遍历完,那保留的所有元素,就是最大的字典序子序列了。

完整代码

arr = raw_input().strip()
out = []
maxval = 0
while arr:
    maxval = max(arr)
    out.append(maxval)
    arr = arr[arr.index(maxval)+1:]
print ''.join(out)

给定整数序列求连续子串最大和

给定无序整数序列,求连续非空子串最大和,例如{-23 17 -7 11 -2 1 -34},子串为{17,-7,11},最大和为21

思路自记

这题类似于找最大字串,就是设定一个起始,一个中止,反复循环就行了,唯一特别坑的地方就是,要考虑负数的情况,如果最后算出来的最大和,是负数,那么就说明这个最大和是小于零的,对负数而言,越接近零的值越大,那对于最大和为负的情况下,只要把最大的负数输出,就是这个串的最大和了。

完整代码

arr = map(int, raw_input().split(' '))
tmp = 0
maxval = 0
ss = []

for i in range(len(arr)):
    tmp = arr[i]
    if tmp < 0:
        ss.append(tmp)
    for j in range(i+1,len(arr)):
        tmp += arr[j]
        maxval = max(tmp, maxval)

if len(arr) == 1:
    print arr[0]
else:
    if maxval > 0:
       print maxval
    else:
       print max(ss)

01序列(暂)

给定一个数组metrix,数组中只包含1和0,且数组中的1都不相邻,输入一个数n,问能否在将数组中n个0替代换成1后不破坏1都不相邻的条件。
例1 metrix=[1,0,0,0,1],n=1输出true
例2 metrix=[1,0,0,0,1],n=2输出false

思路自记

我觉得我的思路没问题,在线下的IDE也没报错,但提交的时候,就是不行,我的思路是这样的:从头开始遍历,如果当前数是0,且这个数的前后数都是0,那么就把这个数置为一,同时将标志位置位true。接着,n是几,就执行这个的过程几次,后面的用前面更新好的序列进行,并且,每次都把flag位置初始为false。

完整代码

m = input()
num = map(int, raw_input().split(' '))
n = input()
while n > 0:
    flag = False
    for i in range(1,len(num)-1):
        if num[i] == 0:
            if num[i-1] == num[i+1] == 0:
                num[i] = 1
                flag = True
    n = n - 1
if flag == True:
    print 'true'
else:
    print 'false'

疯狂序列(暂)

东东从京京那里了解到有一个无限长的数字序列: 1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5, ...(数字k在该序列中正好出现k次)。东东想知道这个数字序列的第n项是多少,你能帮帮他么

思路自记

我自己想的比较粗暴,直接两个循环,第一个统计出现的数k,第二个统计出现k次过程中的项序变化,一直累加,直到等于n的时候,把对应的k输出。

完整代码

n = input()
num = 0
if n > 2:
    for i in range(n):
        for j in range(i):
            num += 1
            if num == n:
                print i
                break
elif n == 1:
    print 1
elif n == 2:
    print 2

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值