当前位置: 首页 > news >正文

一些简单但常用的算法记录(python)

1、计算1-2020间的素数个数

def is_composite(num):
    if num <= 1:
        return False
    # 从 2 开始到 num 的平方根进行遍历
    for i in range(2, int(num**0.5) + 1):
        if num % i == 0:
            return True
    return False


cnt = 0
for num in range(1, 2021):
    if is_composite(num):
        cnt += 1

print(cnt)
    

2、 1900 ~ 9999 年有多少天日历上包含 2?

# 被4整除但不能被100整除,或者能被400整除,闰年
def is_leap_year(year):
    return (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0)

count = 0
for year in range(1900, 10000):
    for month in range(1, 13):
        if month in [1, 3, 5, 7, 8, 10, 12]:
            days = 31
        elif month == 2:
            if is_leap_year(year):
                days = 29
            else:
                days = 28
        else:
            days = 30
        for day in range(1, days + 1):
            # 前填充0
            date_str = str(year) + str(month).zfill(2) + str(day).zfill(2)
            if '2' in date_str:
                count += 1

print(count)

3、从m*n 矩阵的左下角到右上角的走法数量(dp)

def f(m, n):
    # 初始化m*n矩阵dp,用于存储到达每个位置的走法数量
    dp = [[0] * n for _ in range(m)]
    # 将第一列设置为1
    for i in range(m):
        dp[i][0] = 1
    # 将最后一行设置为1
    for j in range(n):
        dp[m - 1][j] = 1

    # 从倒数第二行开始,从左到右填充 dp 数组
    for i in range(m - 2, -1, -1):
        for j in range(1, n):
            # 状态转移方程:下边和左边的走法数量之和
            dp[i][j] = dp[i + 1][j] + dp[i][j - 1]

    # 右上角位置的走法数量
    return dp[0][n - 1]

print(f(4, 4)) # 20

4、验证一个括号序列是否完整且匹配

def f(sequence):
    stack = []
    mapping = {")": "(", "}": "{", "]": "["}
    for char in sequence:
        if char in mapping.values():
            # 遇到左括号,压入栈中
            stack.append(char)
        elif char in mapping.keys():
            if not stack or stack.pop() != mapping[char]:
                # 栈为空或者栈顶元素与当前右括号不匹配
                return False
    return len(stack) == 0

print(f("([{}])")) # True

5、输出杨辉三角的前n行

def f(n):
    triangle = []
    for i in range(n):
        row = [1] * (i + 1) # 初始化行为1
        for j in range(1, i):
            # 将 (左上, 上) 相加
            row[j] = triangle[i - 1][j - 1] + triangle[i - 1][j]
        triangle.append(row)
    return triangle

result = f(5)
for row in result:
    print(row)

6、给定一颗含节点权重的完全二叉树,计算权重和最大的层的深度

# 计算每一层的权重和,保存在字典里,求字典最大值
def f(N, weights):
    # 初始化每个深度的权值和
    depth_sums = {}
    for i in range(N):
        # 对于节点索引 i,深度 = (i).bit_length()
        depth = (1+i).bit_length()
        # 累加该深度的权值
        if depth in depth_sums:
            depth_sums[depth] += weights[i]
        else:
            depth_sums[depth] = weights[i]

    # 找出权值和最大的深度
    max_weight = max(depth_sums.values())
    for depth in sorted(depth_sums.keys()):
        if depth_sums[depth] == max_weight:
            return depth

N = int(input())
weights = list(map(int, input().split()))
print(f(N, weights))

7、构造长度为 10000 的数字字符串,要求不含0且包含 3 和 7,求满足条件的数字字符串个数,结果对(10^9 + 7)取余

MOD = 10**9 + 7
n = 10000

# 计算 9^n, 8^n, 7^n 并取模
# pow(9, n, MOD) 不考虑0的情况数  (9^10000)
# pow(8, n, MOD) 不含3或7的情况数 (8^10000)
# pow(7, n, MOD) 不含3和7的情况数 (7^10000)
result = pow(9, n, MOD) - 2 * pow(8, n, MOD) + pow(7, n, MOD)

print(result % MOD)
    

相关文章:

  • C++算法之代码随想录(链表)——基础知识
  • 解决opencv中文路径问题
  • 力扣热题100刷题day63|49.字母异位词分组
  • Windows 图形显示驱动开发-WDDM 1.2功能_WDDM 1.2 和 Windows 8
  • Uniapp Vue 实现当前日期到给定日期的倒计时组件开发
  • 8.4 容器2
  • 尼日利亚拉各斯云服务器和VPS的综合分析,涵盖其优势、价格、推荐服务商及选择建议
  • 大模型论文:Language Models are Unsupervised Multitask Learners(GPT2)
  • netstat 查看端口占用、杀死进程
  • JAVA实现在H5页面中点击链接直接进入微信小程序
  • 课堂总结。
  • edge 更新到135后,Clash 打开后,正常网页也会自动跳转
  • 微服务拆分的原则、时机、方法以及常见问题
  • C++中stack函数的用法示例
  • 大模型——Llama Stack快速入门 部署构建AI大模型指南
  • 探索 Vue 3 中 vue-router 的 router.resolve () API
  • Python编程快速上手 让繁琐工作自动化笔记
  • 身份证号实名认证接口:让身份核验变得简单与高效
  • VMware安装飞牛私有云fnOS并挂载小雅Alist实现异地远程访问
  • BUUCTF-web刷题篇(21)
  • 东台做网站哪家便宜/广西网站建设制作
  • 现在石家庄做网站的公司有哪几家/查询网入口
  • 毕设做网站可以用模板吗/网站推广方案模板
  • 建设机械员证书查询网站/2022年最新热点素材
  • 网站文章要求/写软文能赚钱吗
  • 网站广告案例/会计培训机构排名