从算法练习题中学习新的算法思想(python)

1.由问题的特征得到解题思路

1.1 m个苹果放入n个盘子问题

链接地址:https://www.cnblogs.com/wxgblogs/p/5742618.html

1.2 蛇形矩阵

题目说明
蛇形矩阵是由1开始的自然数依次排列成的一个矩阵上三角形。

样例输入
5
样例输出

1 3 6 10 15

2 5 9 14

4 8 13

7 12

11

try:
    while True:
        num=int(raw_input())
        L=[[0 for i in range(0)] for j in range(num)]
        insert=1;
        for i in range(num):
            for j in range(i+1):
                L[i-j].append(str(insert))
                insert=insert+1
        for i in range(num):
            print ' '.join(L[i])
except:
    pass

1.3 统计每个月兔子的总数

题目描述

有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?

/**
 * 统计出兔子总数。
 * 
 * @param monthCount 第几个月
 * @return 兔子总数
 */
public static int getTotalCount(int monthCount)
{
    return 0;
}
while True:
    try:
        month=int(raw_input())
        if month<3:
            print 1
        else:
            a=1
            b=1
            for i in range(3,month+1):
                a,b=b,a+b
            print b
    except:
        break

1.4 名字的漂亮度

题目描述

给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。

def data_deal(name):
    count = 0
    count_list = []
    list1 = list(range(1,27))[::-1]
    for i in range(len(name)):
        num = name[i]
        count_list.append(name.count(num))
    count_list.sort(reverse=True)  # 关键是要求出每个字符出现的次数
    list2 = []
    for i in range(len(count_list)):
        num = count_list[i]
        if num > 1 and (num in list2):
            continue
        if num > 1:
            n = int(count_list.count(num) / num)  # 采用该公式就不需要将字符出现的次数和是哪个字符一一对应了
            for j in range(n):
                list2.append(num)
        else:
            list2.append(1)
    for i in range(len(list2)):
        num = list2[i]
        count += num * list1[i]
    return count

while 1:
    try:
        n = int(input())
        name_list = []
        while 1:
            name = input()
            name_list.append(name)
            if len(name_list) == n:
                break
        for name in name_list:
            print(data_deal(name))
    except:
        break

2.求解该类问题的默认最佳算法

2.1 求解最长回文子串问题

采用中心扩展法,链接地址:https://www.cnblogs.com/baiyb/p/8326216.html

2.2 求解最长上升子序列

采用动态规划法,链接地址:https://blog.csdn.net/Tianchi_M/article/details/82691277
采用二分法,链接地址:https://blog.csdn.net/wenlyq/article/details/87556902
使用贪心选择 + 二分查找算法,链接地址:https://blog.csdn.net/lw_power/article/details/80758674

3.根据python语言的特征

3.1 称砝码

题目描述

现有一组砝码,重量互不相等,分别为m1,m2,m3…mn;
每种砝码对应的数量为x1,x2,x3…xn。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。

注:称重重量包括0

方法原型:public static int fama(int n, int[] weight, int[] nums)

链接:https://www.nowcoder.com/questionTerminal/f9a4c19050fc477e9e27eb75f3bfd49c
来源:牛客网

while True:
    try:
        a = int(input())
        weight = list(map(int,input().split()))
        count = list(map(int,input().split()))
        fm,temp,ans = [],[],[0]
        # 将所有砝码放入列表
        for i in range(a):
            for j in range(count[i]):
                fm.append(weight[i])
        # 称重
        for i in fm:
            temp = set(ans)
            for j in temp:
                ans.append(j+i)
        # 去重
        print(len(set(ans)))
    except:
        break

你可能感兴趣的:(算法,学习,python)