算法-练习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

# 有四个数字:1234,能组成多少个互不相同且无重复数字的三位数?各是多少?

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:

# 两个列表mn,组合成一个字典(要求一个作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

字符串排序

 

s1 = 'abcdef'
s2 = 'aBcDef'
print(sorted(s1))
print(sorted(s2))
print(sorted(s2, key=lambda x: x.lower()))
 
列表排序
li = [3, 2, 1, 4, 5, 6]
print(sorted(li))
li = [1, 2, 1, 3, 4, 5]
print(sorted(li, key=lambda x: li.count(x)))
print(sorted(li, key=lambda x: li.count(x), reverse=True))
 
set去重+list()
 
字典排序

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

# abc三数相加等于1000a的平方加b的平方等于c的平方,abc共有多少组合?

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,它有约数 1236,除去它本身 6 外,其余3 个数相加,1+2+3=6
第二个完全数是 28,它有约数 12471428,除去它本身 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子句将被跳过。

"""

nums = []
for i in range(2, 101):
    for j in range(2, i):
        if i % j == 0:
           break
    else:
    nums.append(i)
print(nums)
 
posted @ 2023-02-22 18:28  zxy_ang  阅读(20)  评论(0)    收藏  举报