算法-练习1
题1:
冒泡排序:
def bubbling(nums):
n = len(nums)
for j in range(n-1):
count = 0
"""2、从头走到尾,执行多少次,n-1次"""
"""j = 0,1,2...n-2; range(0,n-1)"""
"""i =n-1-0,n-1-1...n-1-j"""
for i in range(0, n-1-j):
"""1、此循环是从头走到尾"""
if nums[i] > nums[i+1]:
nums[i], nums[i + 1] = nums[i + 1], nums[i]
count += 1
if 0 == count:
break
if __name__ == '__main__':
list1 = [7, 9, 2, 5]
print(list1)
bubbling(list1)
print(list1)
"""
[7, 9, 2, 5]
[2, 5, 7, 9]
"""
题2:
# 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
for i in range(1, 5):
for j in range(1, 5):
for k in range(1, 5):
if (i != j) and (i != k) and (j != k):
print(i, j, k, end='//')
"""
结果:
1 2 3//1 2 4//1 3 2//1 3 4//1 4 2//1 4 3//2 1 3//2 1 4//2 3 1//2 3 4//2 4 1//2 4 3//3 1 2//3 1 4//3 2 1//3 2 4//
3 4 1//3 4 2//4 1 2//4 1 3//4 2 1//4 2 3//4 3 1//4 3 2//
"""
题3:
# 给定两个大小分别为 m 和 n 的正序(从小到大)数组 nums1 和 nums2。请你找出并返回这两个正序数组的 中位数 。
def func(m, n):
m.extend(n)
num = len(m)
if num % 2 == 0:
i = int((num / 2) - 1)
k = i + 1
middle_num = (m[i] + m[k]) / 2
print(middle_num)
else:
j = int((num + 1) / 2)
print(m[j - 1])
m = [1, 2]
# n = [3, 4] #偶数
n = [3, 4, 6]
func(m, n)
"""
结果:
2.5
3
"""
题4:
# 两个列表m和n,组合成一个字典(要求一个作key、一个作value)
def func(a, b):
dic = dict(zip(a, b))
print(dic)
func([1, 2, 'a'], ['李白', 'Man', '你好'])
"""
结果:
{1: '李白', 2: 'Man', 'a': '你好'}
"""
题5:
# 给定一个整数数组和一个目标值,找出数组中和为目标值的两个数。可以假定每个输入只对应一种答案,且元素不能被重复利用。
例: 给定 nums = [2,7,11,15],target = 9
因为 nums[e] + nums[1] = 2 + 7 = 9所以返回 [e,1]
def sumnum(nums, target):
dic = {}
for i in range(len(nums)):
if target - nums[i] in dic:
return [dic[target - nums[i]], i]
dic[nums[i]] = i
li = [2, 7, 11, 15]
# li = [2, 11, 7, 15]
print(sumnum(li, 9))
"""
执行结果:
[0, 1]
"""
题6:
字符串排序
dic = {'e': 1, 'f': 18, 'a': 6, 'b': 5}
print(sorted(dic.items(), key=lambda x: x[0]))
print(sorted(dic.items(), key=lambda x: x[0], reverse=True))
print(sorted(dic.items(), key=lambda x: x[1]))
print(sorted(dic.items(), key=lambda x: x[1], reverse=True))
"""
执行结果:
[('a', 6), ('b', 5), ('e', 1), ('f', 18)]
[('f', 18), ('e', 1), ('b', 5), ('a', 6)]
[('e', 1), ('b', 5), ('a', 6), ('f', 18)]
[('f', 18), ('a', 6), ('b', 5), ('e', 1)]
"""
题7:
# a、b、c三数相加等于1000,a的平方加b的平方等于c的平方,a、b、c共有多少组合?
from time import time
start_time = time()
for a in range(0, 1001):
for b in range(0, 1001):
# for c in range(0, 1001):
c = 1000-a-b
# if 1000 == a + b + c and a ** 2 + b ** 2 == c ** 2:
if a ** 2 + b ** 2 == c ** 2:
# print("a, b, c: %d,%d,%d" % (a, b, c))
print(f'a:{a}, b:{b}, c:{c}')
end_time = time()
cust_time = end_time - start_time
print("cust_time: %s" % cust_time)
"""
结果:
a, b, c: 0,500,500
a, b, c: 200,375,425
a, b, c: 375,200,425
a, b, c: 500,0,500
cust_time: 1.0411646366119385
"""
题8
"""
打印出 100-999 所有的"水仙花数”,所谓"水仙花数"是指一个三位数,其冬位数字立方和等于该数本身。
例如: 153 是一个"水仙花数”,因为 153=1 的三次方+ 5的三次方+3 的三次方。
"""
li = []
for i in range(100, 1000):
li1 = list(str(i))
sum = 0
for j in li1:
sum += int(j)**len(li1)
if i == sum:
li.append(i)
print(f'100-999的水仙花数是:{li}')
"""
100-999的水仙花数是:[153, 370, 371, 407]
"""
题9:
"""
如果一个数恰好等于它的因子之和,则称该数为“完全数”,又称完美数或完备数。
例如:第一个完全数是 6,它有约数 1、2、3、6,除去它本身 6 外,其余3 个数相加,1+2+3=6。
第二个完全数是 28,它有约数 1、2、4、7、14、28,除去它本身 28外,其余 5 个数相加,1+2+4+7+14=28。
那么问题来了,求 1000 以内的完全数有哪些?
"""
li = []
for i in range(1, 1000):
sum = 0
for j in range(1, i):
if i % j == 0 and i != j:
sum += j
if i == sum:
# print(i)
li.append(i)
print(f'1000 以内的完全数:{li}')
"""
结果:1000 以内完全数:[6, 28, 496]
"""
题10
"""
计算 n!,例如 n=3(计算 321=6), 求 100!
"""
# 递归
def recurrence(n):
if 1 == n:
return 1
else:
return n * recurrence(n-1)
print(recurrence(5))
"""
题11
100以内的所有质数。
# else子句只在循环成功执行且没有被break语句中断的情况下执行。如果break语句被执行并中断循环,else子句将被跳过。
"""