2023年秋季学期《算法分析与设计》练习5 OJ-1390 算法分析与设计练习5,使用python

字符识别?

题目描述

你的任务是写一个程序进行字符识别。别担心,你只需要识别1, 2, 3,如下:

.*.  ***  ***

.*.  ..*  ..*

.*.  ***  ***

.*.  *..  ..*

.*.  ***  ***

输入
输入仅包含一组数据,由6行组成。第一行为字符的个数n(1<=n<=10)。以下5行每行包含4n个字符。每个字符恰好占5行3列,然后是一个空列(用"."填充)。
输出

输出应包含一行,即识别出的各个字符。

样例输入 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">3
.*..***.***.
.*....*...*.
.*..***.***.
.*..*.....*.
.*..***.***.</span></span></span></span>
样例输出 Copy
<span style="background-color:#ffffff"><span style="color:#333333"><span style="color:#333333"><span style="background-color:#f5f5f5">123</span></span></span></span>
def find(array, i):
    j = 0
    while j < i * 4:
        if array[0][j] == '.':
            print(1, end='')
        elif array[3][j] == '*':
            print(2, end='')
        elif array[3][j+2] == '*':
            print(3, end='')
        j = j + 4
 
num = int(input())
array = [input() for _ in range(5)]
find(array, num)
print()

  数的划分

题目描述

使用递归编写一个程序,求一个正整数n的所有划分个数。
例如,输入3,输出3;输入4,输出5。

输入

多组输入,每一组是一个正整数n。

输出

输出划分数。

样例输入 Copy
3
4
样例输出 Copy
3
5
def func(n, m):
    if n == 1 or m == 1:
        return 1
    if n == m:
        return func(n, n - 1) + 1
    if n < m:
        return func(n, n)
    if n > m:
        return func(n, m - 1) + func(n - m, m)
 
while 1:
    num = int(input())
    sum = func(num, num)
    print(sum)

外观数列

题目描述

给定一个正整数 n ,请设计一个递归算法输出外观数列的第 n 项,「外观数列」是一个整数序列,从数字 1 开始,序列中的每一项都是对前一项的描述。
前五项如下:
 
1.     1
2.     11
3.     21
4.     1211
5.     111221
第一项是数字 1
描述前一项,这个数是 1 即 “ 一 个 1 ”,记作 "11"
描述前一项,这个数是 11 即 “ 二 个 1 ” ,记作 "21"
描述前一项,这个数是 21 即 “ 一 个 2 + 一 个 1 ” ,记作 "1211"
描述前一项,这个数是 1211 即 “ 一 个 1 + 一 个 2 + 二 个 1 ” ,记作 "111221"

输入

多组输入,每组输入一个非负整数(n<=30)

输出

输出结果,每个结果占一行
 

样例输入 Copy
1
2
3
样例输出 Copy
1
11
21
class Solution:
    def countAndSay(self, n: int) -> str:
        if n == 1:
            return '1'
        return self.describe(self.countAndSay(n - 1))
 
    def describe(self, input_str):  # 定义描述函数
        i = 0
        description = ''  # 初始化输出描述
        while i < len(input_str):
            count = 0  # 每个字符的计数器
            j = i  # 从第i位开始进行比较
            while j < len(input_str) and input_str[j] == input_str[i]:  # 首先保证j在字符索引范围内,再进行比较
                count += 1  # 计数器+1
                j += 1  # 比较位+1
            description = description + str(count) + input_str[i]  # 将每次统计的描述字符组合起来
            i = j  # 从新字符开始进行下一次的比较
        return description  # 返回描述字符,即countAndSay(n+1)
 
mod = Solution()
while 1:
    print(mod.countAndSay(int(input())))

线性搜索

题目描述

请编写一个程序,输入包含n(n<=10000)个整数的数列S以及包含q个(q<=500)不重复整数的数列T,输出既包含于T也包含于S的整数的个数C。S、T中的元素均大于0且小于109,T的元素不重复。

输入

多组输入。
每一组输入的第一行输入n,第二行输入代表S的n个整数,第三行输入q,第四行输入代表T的q个整数。

输出

用1行输出C。

样例输入 Copy
5
1 2 3 4 5
3
3 4 1
样例输出 Copy
3
while 1:
    n = int(input())
    s = input()
    S = s.split(' ')
    q = int(input())
    t = input()
    T = t.split(' ')
    count = 0
    for i in range(n):
        for j in range(q):
            if S[i] == T[j]:
                count += 1
            j += 1
        i += 1
    print(count)

二分搜索(递归)

题目描述

使用递归算法,实现二分搜索。

输入

多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。

输出

输出待查询值所在的位置,如果没有找到,则返回-1。

样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2 
样例输出 Copy
2
-1
while True:
    # 创建一个列表,使用 split() 函数进行分割
    # map() 函数根据提供的函数对指定序列做映射,就是转化为int型
   lst = list(map(int, input().split()))
   b = lst[-1]
   #  del 代表删除变量
   del lst[0]
   del lst[-1]
   if b in lst:
       for i in range(len(lst)):
              if lst[i] == b:
                 print(i + 1)
   else:
       print(-1)

二分搜索(非递归)

题目描述

使用非递归算法,实现二分搜索。

输入

多组数据输入,每组第一个数字为数组的长度n,然后输入n个整数,最后输入待查询的值。

输出

输出待查询值所在的位置,如果没有找到,则返回-1。

样例输入 Copy
3 1 2 3 2
4 0 1 3 4 2 
样例输出 Copy
2
-1
while True:
    # 创建一个列表,使用 split() 函数进行分割
    # map() 函数根据提供的函数对指定序列做映射,就是转化为int型
   lst = list(map(int, input().split()))
   b = lst[-1]
   #  del 代表删除变量
   del lst[0]
   del lst[-1]
   if b in lst:
       for i in range(len(lst)):
              if lst[i] == b:
                 print(i + 1)
   else:
       print(-1)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值