「Python」2020.04.03学习笔记 | 第五章字符串-习题19、20

  • 学习测试开发的Day92,真棒!
  • 学习时间为1H30M
  • 第五章习题 19、20

19、报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位

代码:

"""
用一个变量 count_num 记录总报数次数,每次从头遍历整个列表(位置遍历),当列表元素不
为 0 的时候(用 0 标记删除的人)
count_num += 1,每次判断 count_num ,如果能被 3 除尽就把对应位置赋值 0
重复以上过程,直到列表包含 0 的个数等于列表长度-1
最后找出不是 0 的那个位置就是留下的位置
"""
mylist=[1,2,3,4,5,6,7,8]
count_num=0
while mylist.count(0)

输出:

PS D:\0grory\chapter5> python .\19mybs.py
[0, 0, 0, 0, 0, 0, 7, 0]
最后留下的是原来第7号的人
PS D:\0grory\chapter5>

理解答案代码:

## 19、报数问题:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位
lst = [1,2,3,4,5,6,7]
count_num = 0
while lst.count(0) < len(lst)-1:
    print("=====:",lst.count(0))
    for i in range(len(lst)):
        print("%%%%%%%%%: ",lst)
        #print("len(lst) : ",len(lst))
        if lst[i] != 0:
            count_num += 1
            print("count_num : ",count_num)
            print("lst[i] : ",i,lst[i])
        if count_num%3 == 0:
            print("i : ",i)
            print("lst[i] : ",lst[i])
            lst[i] = 0
            
print("***********",lst)
for v in lst:
    if v != 0:
        print("最后留下的是原来第 %d 号的人" %v)

输出:

PS D:\0grory\chapter5> python .\19bs.py
=====: 0
%%%%%%%%%:  [1, 2, 3, 4, 5, 6, 7]
count_num :  1
lst[i] :  0 1
%%%%%%%%%:  [1, 2, 3, 4, 5, 6, 7]
count_num :  2
lst[i] :  1 2
%%%%%%%%%:  [1, 2, 3, 4, 5, 6, 7]
count_num :  3
lst[i] :  2 3
i :  2
lst[i] :  3
%%%%%%%%%:  [1, 2, 0, 4, 5, 6, 7]
count_num :  4
lst[i] :  3 4
%%%%%%%%%:  [1, 2, 0, 4, 5, 6, 7]
count_num :  5
lst[i] :  4 5
%%%%%%%%%:  [1, 2, 0, 4, 5, 6, 7]
count_num :  6
lst[i] :  5 6
i :  5
lst[i] :  6
%%%%%%%%%:  [1, 2, 0, 4, 5, 0, 7]
count_num :  7
lst[i] :  6 7
=====: 2
%%%%%%%%%:  [1, 2, 0, 4, 5, 0, 7]
count_num :  8
lst[i] :  0 1
%%%%%%%%%:  [1, 2, 0, 4, 5, 0, 7]
count_num :  9
lst[i] :  1 2
i :  1
lst[i] :  2
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 7]
i :  2
lst[i] :  0
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 7]
count_num :  10
lst[i] :  3 4
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 7]
count_num :  11
lst[i] :  4 5
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 7]
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 7]
count_num :  12
lst[i] :  6 7
i :  6
lst[i] :  7
=====: 4
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 0]
count_num :  13
lst[i] :  0 1
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 0]
count_num :  14
lst[i] :  3 4
%%%%%%%%%:  [1, 0, 0, 4, 5, 0, 0]
count_num :  15
lst[i] :  4 5
i :  4
lst[i] :  5
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
i :  5
lst[i] :  0
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
i :  6
lst[i] :  0
=====: 5
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
count_num :  16
lst[i] :  0 1
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
count_num :  17
lst[i] :  3 4
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
=====: 5
%%%%%%%%%:  [1, 0, 0, 4, 0, 0, 0]
count_num :  18
lst[i] :  0 1
i :  0
lst[i] :  1
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
i :  1
lst[i] :  0
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
i :  2
lst[i] :  0
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
count_num :  19
lst[i] :  3 4
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
%%%%%%%%%:  [0, 0, 0, 4, 0, 0, 0]
*********** [0, 0, 0, 4, 0, 0, 0]
最后留下的是原来第 4 号的人
PS D:\0grory\chapter5>

20、由单个字母组成的list,从键盘读入两个整数m、n(n>m),打印出list[m,n]之间的字母能组成的所有n-m+1位不同的字符串

需要了解的函数

math.factorial()

image.png

random.sample()

image.png

代码:

## 20、由单个字母组成的list,从键盘读入两个整数m、n(n>m),打印出list[m,n]之间的字母能组成的所有n-m+1位不同的字符串
'''
能组成的子字符串的个数是字符串长度的阶乘
定义一个列表存在子字符串,每次打乱list[m:],如果其对应的字符串不在结果列表中加入
重复上述过程,直到列表长度等于阶乘值
'''
import random
import string
import math
result=[]
lst=random.sample(string.ascii_letters,15)
print(lst)
while 1:
    try:
        m=int(input(">>m  :  "))
        n=int(input(">>n  :  "))
    except:
        print("请重新输入:")
    else:
        break
if m>n:
    m,n=n,m
print(m,n)
lst_sub=lst[m:n]
print(lst_sub)
max_num=math.factorial(len(lst_sub))
while len(result)

输出:

PS D:\0grory\chapter5> python .\20mn.py
['G', 't', 'C', 'D', 'F', 'Y', 'E', 's', 'z', 'l', 'J', 'k', 'j', 'e', 'P']
>>m  :  h
请重新输入:
>>m  :  r
请重新输入:
>>m  :  5
>>n  :  2
2 5
['C', 'D', 'F']
['DFC', 'CFD', 'CDF', 'FDC', 'DCF', 'FCD']
PS D:\0grory\chapter5>

理解答案代码:

import random
import string
import math
result = []
lst = random.sample(string.ascii_letters,15)
print(lst)
while 1:
    try:
        m = int(input(">>m: "))
        n = int(input(">>n: "))
    except:
        print("请重新输入:")
    else:
        break
if m > n:
    m,n = n,m
print(m,n)
lst_sub = lst[m:n]
print(lst_sub)
max_num = math.factorial(len(lst_sub))
print(max_num)
while len(result) < max_num:
    print(lst_sub)
    random.shuffle(lst_sub)
    print(lst_sub)
    if "".join(lst_sub) not in result:
        result.append("".join(lst_sub))
print (result)

输出:

PS D:\0grory\chapter5> python 20.py
['X', 'H', 'y', 'T', 'u', 'a', 'g', 'k', 'o', 'f', 'm', 'Q', 'W', 'n', 'S']
>>m: 4
>>n: 7
4 7
['u', 'a', 'g']
6
['u', 'a', 'g']
['u', 'a', 'g']
['u', 'a', 'g']
['g', 'a', 'u']
['g', 'a', 'u']
['u', 'a', 'g']
['u', 'a', 'g']
['g', 'a', 'u']
['g', 'a', 'u']
['a', 'u', 'g']
['a', 'u', 'g']
['u', 'a', 'g']
['u', 'a', 'g']
['a', 'u', 'g']
['a', 'u', 'g']
['g', 'u', 'a']
['g', 'u', 'a']
['g', 'a', 'u']
['g', 'a', 'u']
['u', 'g', 'a']
['u', 'g', 'a']
['u', 'a', 'g']
['u', 'a', 'g']
['a', 'g', 'u']
['uag', 'gau', 'aug', 'gua', 'uga', 'agu']

这两道题基本是重在理解了,都没有做出来TT

你可能感兴趣的:(「Python」2020.04.03学习笔记 | 第五章字符串-习题19、20)