python-简单的算法题
一、冒泡排序
'''
冒泡算法
冒泡排序原理就是循环遍历数组,比较相邻两个数的大小,重复比较直到排序完成
N个数字要排序完成,总共要进行N-1趟排序,第i趟的排序次数为(N-i) 次
'''
1 def bubbleSort(arr): 2 n = len(arr) 3 # 遍历所有元组元素 4 for i in range(n): 5 # 每一趟循环最后一位数都会确定,所以需要去掉最后一个数 6 for j in range(0,n-i-1): 7 if arr[j] > arr[j+1]: # 升序大于号,降序小于号 8 arr[j],arr[j+1] = arr[j+1],arr[j] 9 return arr 10 11 arr = [23,10,32,67,43,52] 12 bubbleSort(arr) 13 print("排序后的数组为:") 14 for i in range(len(arr)): 15 print("%d"%arr[i])
二、字符串和列表排序
'''编写一个函数,实现对字符串的排序
大多数排序操作是针对列表的,所以需要先将字符串转换成列表,进行排序,然后再合并成字符串
运用list的sort()函数,sort()函数对原列表进行排序,没有返回值
或者通过sorted()函数,sorted()函数对列表可迭代的对象进行排序操作,返回一个新的list
sort 缺省为升序,降序排列增加reverse=True参数
'''
1 # 方法一 sort() 2 def sort(s): 3 ls = list(s) 4 ls.sort() 5 s1 = "".join(ls) 6 return s1 7 8 s = "3649208" 9 print(sort(s)) 10 11 12 # 方法二 sorted() 13 def sort(s): 14 ls = sorted(s) 15 s1 = "".join(ls) 16 return s1 17 18 s = "345110" 19 print(sort(s))
三、字符串反转
'''
实现输入一个字符串,并将该字符串反转输出
方法一:字符串切片 a[i:j:s] 当s<0时,i缺省时,默认为-1;j缺省时,默认为-len(a) -1
a[::-1] 相当于a[-1:-len(a)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序
方法二:将字符串转换为列表,用列表的reverse()方法
'''
1 # 方法一 字符串切片法 2 a = input("please input str:") 3 print(a[::-1]) 4 5 6 # 方法二 转换成列表,用列表的reverse()方法 7 a = input("please input str:") 8 l = list(a) 9 l.reverse() 10 print("".join(l))
四、字符串计数
'''
列出1-1000中包含1的数字
'''
1 for i in range(1001): 2 if str(i).find("1") == 0: 3 print(i)
'''
生成包含1000个0-100之间的随机整数,并统计每个元素出现的次数
'''
1 import random 2 ls = [random.randint(0,100) for i in range(1000)] 3 st = set(ls) # set()函数创建一个无序不重复元素集 4 for i in st: 5 print(i, "出现的次数:", ls.count(i))
'''
统计字符串中各字符的个数
'''
1 str = input("请输出字符串:") 2 dt = {} 3 for i in str: 4 dt[i] = str.count(i) 5 print(dt)
五、列表左移、右移
'''
列表左移
运用列表的A.pop()方法,去除最后一位并返回值,将最后一位插入到第一位
'''
A = [12,34,56,23,10] a = 2 for i in range(a): A.insert(0,A.pop()) print(A)
'''
列表右移
将第一个元素插到最后一位(len(A)),再去除第一个元素
'''
A = [12,34,56,23,10] a = 2 for i in range(a): A.insert(len(A),A[0]) A.remove(A[0]) print(A)
六、约瑟夫环
'''
问题描述:N个人围成一圈,从第一个人开始报数,报到k的人出圈,剩下的人继续从1开始报数,报到k的人出圈;如此往复,直到所有人出圈。(模拟此过程,输出出圈的人的序号)
解决方案:这道题涉及到的算法叫做约瑟夫算法,需要将列表内所有数类似排列成一个圈来解决,需要将前一次删除后剩下的元素的索引不变,但是位置镶嵌提,无限循环这个圈,直到删除到只剩一个
这道题的关键在于如何将每个数的索引数字固定,在删除前一个数字后,后面的数字都应该在排序中加一。所以我们需要创建一个列表,从1开始含有位数的数字,代表每个数字的索引列表
'''
1 def josephus(n,k): 2 # n代表总人数,K代表报数的数字 3 List = list(range(1,n+1)) 4 index = 0 5 while List: 6 temp = List.pop(0) 7 index += 1 8 if index == k: 9 index = 0 10 continue 11 List.append(temp) 12 if len(List) == 1: 13 print(List) 14 break 15 if __name__ == '__main__': 16 josephus(10,3)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义