【算法】有意思的算法题(附pyhon3代码){更新中}

Pyhon常见的几种加密解密算法 在工作中很多情况是需要对数据进行加解密处理的,比如账号密码加密,还有支付密码的加密等。为了方便我们的工作,可以自己写一套加解密方法用于测试,本文主要介绍以下几种方法,后续有新的也会继续补充。 阅读详情

有趣的算法题合集(附代码)

 

子序列最大和

描述:给出一个数字序列 [1,-2,3,5,-1,4,-7],找出其中的子序列,使得其和最大,返回该最大值。

解决方案:从左到右遍历数列,求和sum,当和sum为负的时候;重新开始新的序列计算;使用一个max变量记录当前求得的最大值。

  • 遍历到 1:sum = 1,max=1
  • 遍历到 -2:sum = -1,max=1 => sum = 0,max=1
  • 遍历到 3:sum = 3,max=3
  • 遍历到 5:sum = 8,max=8
  • 遍历到 -1:sum = 7,max=8
  • 遍历到 4:sum = 11,max=11
  • 遍历到 -7:sum = 4,max=11

所以上述例子返回最大子序列和 max = 11

# encoding: utf-8
"""
@author: github/100101001
@contact: 17702113437@163.com
@time: 2020/3/2 上午12:01
@file: maxSumSubSequence.py
@desc: 
"""
from typing import List


class Solution:
    def maxSumSubSequence(self, arr: List[int]) -> int:
        s = 0
        ret = float('-inf')
        for i in arr:
            s += i
            ret = s if ret < s else ret
            s = 0 if s < 0 else s
        return ret



if __name__ == "__main__":
    solution = Solution()
    print(solution.maxSumSubSequence([1, -2, 3, 5, -1, 4, -7]))

 

股票利润

描述:给出一个股票价格序列 [7,6,2,4,8, 3,1],找到买入和卖出的天,使得利润最高。

解决方案:不同于使用动态规划的思想,这里转换子序列最大和问题来解决,利用

  F(b) - F(a)= \int _{a}^{b} f(x)  ,先遍历序列的到一个差分序列:[-1,-4,2,4,-5,-2]。等式左右取max,对右侧来说就是求一个子序列最大和。

  • 遍历到 1:sum = -1,max=-1 => sum = 0,max=-1
  • 遍历到 -4:sum = -4,max=-1 => sum = 0,max=-1
  • 遍历到 2:sum = 2,max=2
  • 遍历到 4:sum = 6,max=6
  • 遍历到 -5:sum = 1,max=6
  • 遍历到  -2:sum = -1,max=6  => sum = 0,max=6

所以就是在第3天买入,第5天卖出,最挣钱。

# encoding: utf-8
"""
@author: github/100101001
@contact: 17702113437@163.com
@time: 2020/3/2 上午12:07
@file: maxProfit.py
@desc: 
"""
from typing import List


class Solution:
    def maxProfit(self, arr: List[int]) -> int:
        diff = [arr[i] - arr[i - 1] for i in range(1, len(arr))]
        print(diff)
        return self.maxSumSubSequence(diff)

    def maxSumSubSequence(self, arr: List[int]) -> int:
        s = 0
        ret = float('-inf')
        for i in arr:
            s += i
            ret = s if ret < s else ret
            s = 0 if s < 0 else s
        return ret


if __name__ == "__main__":
    solution = Solution()
    print(solution.maxProfit([7, 1, 5, 3, 6, 4]))

 

鸡蛋测试

描述:一栋100层高的楼房,用两个鸡蛋测试在哪一层鸡蛋正好摔碎?最少实验几次可以得到结论?

解决方案:基于第一个鸡蛋有没有碎,和剩余试验次数,选择下一轮试验楼层

  • 第一次选择: 我们希望楼层越高越好,因为如果没碎,可以尽量多的排除楼层。但不能高过第 k 层,因为如果第1个鸡蛋碎了,第2个鸡蛋只有k-1次实验机会,也就是从1楼试到最高第 k-1,再高层试不了。
  • 第二次选择:
    • k层碎了,就从 1 试到 k-1
    • k层没碎,同理,在 k + (k-1) 层尝试
  • 第三次选择(没碎):在 k + (k-1) + (k-2) 层尝试
  • 。。。
  • 第 k 次选择 (没碎):在 k + (k-1) + (k-2)+....+ 1 层尝试(此时还没碎,就没法排除了)

总结上述方案:用L(i)代表第 i 次尝试的楼层。如果第 i 次尝试碎了,那么只需从 L(i-1)+1, 逐层试到 L(i)-1。如果第 i 次尝试没碎,那么到 L(i+1) = L(i) + k-i+1 层继续试验。

因此,只要第一颗鸡蛋碎了,就能得到解答。问题转换为,必须在k次尝试都没碎时,楼层已经超过了 100 层,否则,无法排除没试过的高层。 列出不等式 (k^{2}+k)/2 \geq 100, k \in \mathbb{Z^{+}} ,可得解 k\geq 14。

 

64马竞赛

问题描述:64匹马,8条赛道,找到最快的 4 匹马。

核心难点:解决锦标赛赛制中的分组公平性问题,也就是最强的马来自同一组的问题。

 

重复次数大于 n/k 的元素

问题描述:数组包含n各元素,给定k,返回重复次数大于 n/k 的数组元素。

核心难点:遍历使用哈希表记频率,时间复杂度O(n),空间复杂度O(n),但一般 n>>k 比如 n=100 ,k=4,希望空间复杂度降低为O(k)级别,时间复杂度适当提高。

解决方案:仍旧遍历,使用哈希表记录频率,但是一旦哈希表满了K个,就删除频率为1的元素。遍历完毕后,哈希表最多满 N/k次,也就是元素最多会被删除 N/k 次,重复次数超过N/k的目标元素不会被删光。遍历完,哈希表中的键总数小于k,对所有键检查是否重复超过N/k次即可。

这个方法的时间复杂度,分为两部分,首先是遍历数组,每次放入或更新哈希表的键值前,都可能要判断哈希表键满K个,如果满了需要遍历删除值为1的元素,所以该部分复杂度O(N*k);然后检查哈希表剩余键,每个遍历一次数组,复杂度O(N*k),整体时间复杂度O(N*k)

# encoding: utf-8
"""
@author: github/100101001
@contact: 17702113437@163.com
@time: 2020/3/1 下午11:29
@file: kelement.py
@desc: 在n个元素的数组中找到重复次数大于 k 分之一的元素, n>>k
"""

from typing import List


class Solution:
    def above_one_k(self, arr: List[int], k: int) -> List[int]:
        d = {}
        for item in arr:
            if item in d:
                d[item] = d[item] + 1
            else:
                d[item] = 1
            if len(d) >= k:
                # 字典迭代不能删项
                for it in list(d.items()):
                    if it[1] == 1:
                        del d[it[0]]
        ret = [int]
        for key in d.keys():
            num = 0
            for v in arr:
                if key == v:
                    num += 1
            if num > k:
                ret.append(key)
        return ret


if __name__ == "__main__":
    s = Solution()
    print(s.above_one_k([1, 1, 1, 1, 2, 33, 4, 21, 2, 2, 2], 3))

 

求二进制中1的个数

问题描述:对于一个 n bit 的二进制数,求1的个数,时间效率尽可能高

遍历方案:循环右移,看低位是否为1,时间效率O(n)

核心难点:方案一定不是遍历,遍历0是浪费的。也就是如何能定位到下一个1的位置,去掉不必要的0遍历。

思路1:对于 0100,0100。如果定位到第一个1,那么 0100,0100 - 0100,0000 = 0000,0100。然后,定位到第二个 1,0000,0100 - 0000,0100 = 0  结束。问题回到了给定一个串,如何定位最高位的1。这里引入一个技巧,对于2的整次幂,0000,0100 & 0000,0011 = 0。

思路2:不断从 0100,0100 中运用位运算去掉1,能去几次,就有几个1。灵感来源:比如对于 0000,0100  & 0000,0011 = 0,去掉了 1,注意减数 0000,0011 = 0000,0100 - 1 ;又比如对于 0010,0100 & 0010,0011 = 0010,0000。综上述两个例子总结规律 v & (v-1) 可以去掉v中最低位的一个1。

解决方案:对于输入位串 v 。当 v !=0 时,令 v = v & (v-1),直到 v == 0。计算 循环去1 执行的次数,就是v中1的个数。

# encoding: utf-8
"""
@author: github/100101001
@contact: 17702113437@163.com
@time: 2020/3/1 下午11:35
@file: binary1.py
@desc: 在二进制串中计算1的个数
"""


class Solution:
    def count1inBinary(self, seq: int) -> int:
        num = 0
        while seq:
            seq &= seq - 1
            num += 1
        return num


if __name__ == "__main__":
    s = Solution()
    print(s.count1inBinary(255))

 

 

GWO||史上最正确的灰狼算法Pyhon实现 文本将从灰狼算法公式与原理,代码实现与注释,参数调优与测试三方面带你解开灰狼算法的”神秘面纱“。 阅读详情

相关推荐

pyhon下实现通过身份证获取归属地的方法

本篇文章主要讲解,python3下安装pymysql、pip更新以及身份证归属地的查询方法实例 日期:2021-7-10 作者:任聪聪 注意事项: 1.需要安装python的数据库模块 2.需要自行搭建数据库,数据库文件可前往此处下载 https://download.youkuaiyun.com/download/hj960511/20150575 pip升级命令: python -m pip install --upgrade pip pip 版本查询命令:pip --version 安装pymysql 命.

任聪聪的博客 4087

程序员的算法趣题pdf

下载地址:网盘下载内容简介······本书是一本解谜式的趣味算法书,从实际应用出发,通过趣味谜题的解谜过程,引导读者在愉悦中提升思维能力、掌握算法精髓。此外,本书作者在谜题解答上,通过算法的关键原理讲解,从思维细节入手,发掘启发性算法新解,并辅以Ruby、JavaScript等不同语言编写的源代码示例,使读者在算法思维与编程实践的分合之间,切...

weixin_30456039的博客 477

程序员的算法趣题.pdf.zip

面试算法题

[图灵程序设计丛书].程序员的算法趣题.pdf

[图灵程序设计丛书].程序员的算法趣题.pdf 下载链接 转载于:https://blog.51cto.com/4456998/2378262

weixin_33862041的博客 513

国宇测试盒GH7009 SPI读操作全解析:从接线到代码实现的避坑指南

本文详细解析了国宇GH7009测试盒进行SPI读操作的完整流程与避坑要点。重点阐述了硬件连接中IO2时序控制引脚的关键作用,提供了从接线方案、电源处理到上位机代码实现的实战指南,并针对常见的数据不稳定、特定寄存器读取失败等问题给出了具体解决方案。

dapp9builder的博客 223

threekingdoms.txt中文三国演义下载及实现人物出场统计

threekingdoms.txt全文下载:https://python123.io/resources/pye/threekingdoms.txt CalThreeKingdomsV1.py: #CalThreeKingdomsV1.py import jieba txt = open("threekingdoms.txt", "r", encoding = "utf-8").read() words = jieba.lcut(txt) counts = {} for word in words:

ZYYRWish_97的博客 1万+

程序员的算法趣题Perl版 每日一题2

第三题 解数独 答案为 @sd =(['5','3','.','.','7','.','.','.','.'], ['6','.','.','1','9','5','.','.','.'], ['.','9','8','.','.','.','.','6','.'], ['8','.','.','.','6','...

jiemaoshangdewu的专栏 233

别再只会用QTcpSocket了!手把手教你用QSslSocket为你的Qt网络应用加上SSL/TLS加密(附完整代码示例)

本文详细介绍了如何将Qt网络应用从QTcpSocket迁移到QSslSocket,实现SSL/TLS加密传输。通过对比API差异、解析核心机制和提供完整代码示例,帮助开发者快速掌握安全网络编程技巧,有效防范数据窃听和中间人攻击等安全风险。

weixin_30654583的博客 400

程序员算法趣题 | (2)数列的四则运算

# op = ["+", "-", "*", "/", ""] op = ["", "*"] for i in range(1000,10000): # 末尾数字不为0 if (i % 10 == 0): continue # 将四位数转化为数列的方法提供以下两种 # 利用format 格式化函数 这个格式化输出就是 一串字符串 9999 # ...

qq_40276310的博客 390

【笔试真题】- 华子-2025.12.17-研发岗

难度:中等难度:中等偏难难度:中等K小姐是一名服务器运维工程师,她负责监控公司服务器的访问日志。服务器采用指数退避策略来优化访问频率,每次重试的时间间隔会按照某种规律增长。经过一段时间的监控,K小姐记录了 nnn 个访问时间点,第 iii 个时间点的值为 a[i]a[i]a[i](可能有重复)。现在,她想分析这些访问时间点是否符合某种特定的模式。具体来说,对于给定的参数对 (x,y)(x, y)(x,y),她想知道:有多少个访问时间点 a[i]a[i]a[i] 满足 a[i]=xK+ya[i] = x^K

春秋招笔试突围 185

【Unity 实用工具篇】| Unity中 实现背景模糊效果,简单易用

背景模糊 是一个很实用的功能,它可以帮助游戏在视觉上有更好的专注力和表现力。 实现模糊的种类和方式有很多种,大家自行选择适合自己的就可以了。 下面一起来看下本文实现背景模糊的效果和使用方式吧!

努力前行,总会成为自己心中的那道光 4万+

树莓派3b pyhon3.5 安装opencv3.4

参考了百度文库、优快云的各位大佬的安装教程,重复安装了好多次都没有成功。最后在同学的帮助下,在google上找到了解决方法。下面就是所安装的具体过程。首先要确保有足够的空间,树莓派至少要需要16G的SD卡,16G的其实都勉强。 首先安装依赖包,在进行软件安装之前要更新一下现有的软件包: sudo apt-get update  sudo apt-get upgrade  #更新系统,慎重选...

eilot_c的博客 791

OBC_开环扫频波特图拟合操作流程(结合 Simulink)

摘要: 本文详细介绍了基于Simulink的开环扫频波特图测试与拟合流程,适用于电源/控制系统(如LLC/PFC)的小信号分析。主要内容包括:1)前期准备(测试点选择、信号范围设定);2)Simulink建模方法(信号注入、数据记录);3)两种扫频方式(逐频正弦/Chirp扫频)的实现;4)MATLAB数据处理(FFT分析、传递函数拟合);5)线性分析工具使用技巧。重点强调了激励信号幅值控制、稳态数据采集及模型验证方法,并提供完整MATLAB脚本示例。该流程可有效获取系统频域特性,为控制器设计提供可靠依据。

Sumerking的博客 232

【anaconda】利用conda命令更新所有的pyhon包

conda update --all

vict_wang的博客 5877

【异常】came as a complete surprise to me,IllegalArgumentException: The template string is not valid.

是Spring AI中用于生成提示词(prompt)的一个类。提示词对于与大语言模型交互至关重要,因为它们指导模型生成特定类型的响应。允许开发者创建包含占位符的模板字符串,并通过提供具体的值来填充这些占位符,从而动态地生成个性化的提示词。

奶爸的编程之路,也就一周冷个三天 746

跨平台也要跑得像原生一样顺:SAP GUI for Java 的安装、配置、运维与自动化实战

摘要:SAP GUI for Java 作为跨平台客户端解决方案,在 S/4HANA 时代仍发挥关键作用,特别适用于 macOS/Linux 环境下的 ABAP 开发和系统运维。其主要优势包括:平台无关性(支持 Windows/macOS/Linux/UNIX)、与 Windows 版本一致的交互体验、对核心事务码(如 ST22/SM21)的完整支持。版本管理需注意 7.80 已停止支持,建议升级至 8.10。安装支持原生包和通用 JAR 两种方式,推荐团队标准化版本和连接配置(通过 SAP UI Land

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 677

用pyhon实现感知器学习算法

用pyhon实现感知器学习算法

zzzzz0728的博客 475

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

pyhon

1.技术面试题(1)解释Linux中的进程、线程和守护进程的概念,以及如何管理它们?答:进程是程序在计算机中的一次执行过程,是操作系统进行资源分配和调度的基本单位。每个进程都有自己独立的地址空间,包括代码段、数据段、堆栈段等。线程是进程中的一个实体,是 CPU 调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。一个进程可以有多个线程,这些线程共享进程的地址空间和资源。

2301_80409593的博客 779

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

pyhon编程excel文件

'联系方式': ['13800000000', '13900000000', '13700000000', '13600000000', '13500000000'],'贷款类型': ['信用贷款', '房贷', '信用贷款', '车贷', '信用贷款'],grouped_df = dy.groupby('贷款类型')['贷款金额'].sum()'姓名': ['张三', '李四', '王五', '赵六', '孙七'],result = dy[dy['姓名'] == '张三']

jeuuhebf的博客 1267

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Pyhon数组拼接:去除重合区间的算法实现

本文介绍了如何使用python进行数组的去重合区间。

qq_39465480的博客 555

django学习 在pyhon shell模式下学习、调试代码

django的shell模式下(通过python manage.py shell启动),可以方便的进行case调查与代码调试 1.case调查 export PYTHONSTARTUP="自定义.py" python manage.py shell可以预加载'自定义.py'的内容,避免每次调查加载django及依赖的数据表定义 2.代码调试 import 模块名;reloa

newmarui的专栏 685

LeetCode算法题之有效的括号

有效的括号 题目: 给定一个只包括 '(',')','{','}','[',']'的字符串,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。 解题思路,采用最简单粗暴的写法,判断左右括号数量, 并且使用 集合存储左括号出现的位置,匹配的右括号出现remove掉,来判断括号的顺序 上代码...

weixin_42462881的博客 229

kail(linux)中安装pyhon3-pip 失败的解决方法【换源】

【代码】kail(linux)中安装pyhon3-pip 失败的解决方法【换源】

qq_42764906的博客 845

Pyhon爬虫抓取Json解析错误

前言 最近在我的Python爬虫中总是会遇到json.loads()方法报错,把抓取到的原文摘出来一看,里面带有转义的 " 和 ',也就是 \"和\'。 一开始遇到这个问题就疯狂上网搜索,结果找不到能解决我问题的答案,所以就想着按照Json解析的算法做一个自己的Json解析算法。不过,这似乎十分麻烦,懒惰的我于是就做了个替换算法。对于 ...

shenshaoming的博客 2737

Python解力扣算法题4(基础)

8.给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。不幸的是,因为数据错误,导致集合里面某一个数字复制了成了集合里面的另外一个数字的值,导致集合 丢失了一个数字 并且 有一个数字重复。# 比赛开始时,记录是空白的。# 在这段代码中,Counter(nums)会返回一个字典,其中的键是数组中的数,值是这个数在数组中出现的次数。

2303_76234920的博客 485
上一篇: 【动态规划】背包问题{更新中}
下一篇: 【数据结构】堆{更新中}
vectorX
博客等级 码龄11年 37粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值