python课程单元三编程题讲解(上)

目录

  • 1.快乐的数字
  • 2.凯撒密码I
  • 3.凯撒密码II
  • 4.括号配对检测 A

@

? ??下面向大家介绍一下我在学习python课程的一些题目的解法,如果大家有什么更好的解法请私信我。这里只显示题目与代码。

1.快乐的数字

???描述:编写一个算法来确定一个数字是否“快乐”。 快乐的数字按照如下方式确定:从一个正整数开始,用其每位数的平方之和取代该数,并重复这个过程,直到最后数字要么收敛等于1且一直等于1,要么将无休止地循环下去且最终不会收敛等于1。能够最终收敛等于1的数就是快乐的数字。????????????????????????????????????????????????????????????????????????????????????????????

例如: 19 就是一个快乐的数字,计算过程如下:???????????????????????????????????????????????????????????????????????????????????????????????

1^2 + 9^2 = 82

8^2 + 2^2 = 68

6^2 + 8^2 = 100

1^2 + 0^2 + 0^2 = 1

当输入快乐的数字时,输出True,否则输出False。

???作者代码:用递归即可。
????????????????????????????????

a = input('')
def num(a):
    sum = 0
    for i in list(a):
        sum += int(i)**2
    try:
        if sum != 1:
            num(str(sum))
        else:
            print('True')
    except:
        print('False')

result = num(a)

2.凯撒密码I

???描述:凯撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:???????????????????????????????????????????????????????????????????????????????????????????????

原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z???????????????????????????????????????????????????????????????????????????????????????????????
密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C?????????????????????????????????????????????????????????????????????????????????????????????

对于原文字符P,其密文字符C满足如下条件:C=(P+3) mod 26???????????????????????????????????????????????????????????????????????????????????????????????

上述是凯撒密码的加密方法,解密方法反之,即:P=(C-3) mod 26????????????????????????????????????????????????????????????????????????????????????????????????

???假设用户可能使用的输入仅包含小写字母a~z和空格,请编写一个程序,对输入字符串进行凯撒密码加密,直接输出结果,其中空格不用进行加密处理。使用input()获得输入。???????????????????????????????????????????????????????????????????

???????????????????????????????作者代码:根据不同条件判断即可。

my_str = input("")
result = ""
for i in my_str:
    if i != my_str[-1] and i not in ['x','y','z']:
        result += chr(int(ord(i)) + 3 % 26)
    elif i == my_str[-1]:
        result += chr(int(ord(i)) + 3 % 26)
    elif i in ['x','y','z']:
        result += chr(int(ord(i)) - 23)
print(result.replace('#',' '))

3.凯撒密码II

???描述:恺撒密码是古罗马凯撒大帝用来对军事情报进行加解密的算法,它采用了替换方法对信息中的每一个英文字符循环替换为字母表序列中该字符后面的第三个字符,即,字母表的对应关系如下:????????????????????????????????????????????????????????????????????????????????????????????????

原文:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z????????????????????????????????????????????????????????????????????????????????????????????????

密文:D E F G H I J K L M N O P Q R S T U V W X Y Z A B C????????????????????????????????????????????????????????????????????????????????????????????????

对于原文字符P,其密文字符C满足如下条件:C = (P+3) mod 26????????????????????????????????????????????????????????????????????????????????????????????????

上述是凯撒密码的加密方法,解密方法反之,即:P = (C-3) mod 26????????????????????????????????????????????????????????????????????????????????????????????????

???假设用户可能使用的输入仅包含西文字母,即英文大小写字母a~zA~Z和特殊字符,请编写一个程序,对输入字符串进行凯撒密码加密,直接输出结果,其中特殊字符不进行加密处理。

??????????????????作者代码:根据是否在ASCII码范围内判断即可。

my_str = input("")
result = ""
for i in my_str:
    if i != my_str[-1] and i not in ['x','y','z','X','Y','Z'] and (65 <= int(ord(i)) <= 90 or 97 <= int(ord(i)) <= 122):
        result += chr(int(ord(i)) + 3 % 26)
    elif i == my_str[-1] and (65 <= int(ord(i)) <= 90 or 97 <= int(ord(i)) <= 122):
        result += chr(int(ord(i)) + 3 % 26)
    elif i in ['x','y','z','X','Y','Z']:
        result += chr(int(ord(i)) - 23)
    else:
        result += i
print(result.replace('#',' '))

4.括号配对检测 A

???描述:用户输入一行字符串,其中可能包括小括号 (),请检查小括号是否配对正确,配对成功与否分别输出:????????????????????????????????????????????????????????????????????????????????????????????????

配对成功,配对不成功????????????????????????????????????????????????????????????????????????????????????????????????

其中,小括号配对要考虑配对顺序,即()表示配对,)(不是配对,只考虑小括号配对。????????????????????????????????????????????????????????????????????????????????????????????????

注意,这是一个OJ题目,获得输入使用input("")。

???????????作者代码:C语言中可以用栈,这里可以不用,用更简单的方法

# 把每一个的右括号的值的位置放进去
def everyRight(right,a):
    # 找到该右括号左边的最近左括号的序列号
    for j in a:
        if j - right < 0:
            m = j
    return m

my_str = input("")
my_list = list(my_str)
a = [];b = []
for i in range(0,len(my_list)):
    if '(' == my_list[i]:
        a.append(i)
    elif ')' == my_list[i]:
        b.append(i)

s1 = [];s2 = []
i = 0
try:
    while 1:
        # 递归,首先,先找到第一个右括号和第一个左括号,找到后,就去除,然后递归
        left = everyRight(b[i],a)
        right = b[i]
        s1.append(left)
        s2.append(right)
        # 删除上一次左括号对应的序号,并将下一次的右括号和左括号调用函数
        a.pop(left)
        everyRight(b[i+1],a)
        i = i+1
except:
    pass

try:
    if len(s1) == len(s2) and len(s1) !=0 and len(a) != 1:
        print('配对成功')
    else:
        print('配对不成功')
except:
        print('配对不成功')

但是这种方法有问题,比如遇到下面的输出:

为什么会出现这种情况呢?我们看下如下输出:

???这时候就是一种错误就是当遇到了右括号还没有遇到左括号就会停下,我们把列表删去我们除去的值,当到了最后停止时,再根据左右括号个数判断。
代码如下:

# 把每一个的右括号的值的位置放进去
def everyRight(right,a):
    # 找到该右括号左边的最近左括号的序列号
    for j in a:
        if j - right < 0:
            m = j
    return m

my_str = input("")
my_list = list(my_str)
a = [];b = []
for i in range(0,len(my_list)):
    if '(' == my_list[i]:
        a.append(i)
    elif ')' == my_list[i]:
        b.append(i)

s1 = [];s2 = []
i = 0
try:
    while 1:
        # 递归,首先,先找到第一个右括号和第一个左括号,找到后,就去除,然后递归
        left = everyRight(b[i],a)
        right = b[i]
        s1.append(left)
        s2.append(right)
        print('right{0}'.format(right))
        # 删除上一次左括号对应的序号,并将下一次的右括号和左括号调用函数
        a.pop(left)
        # 删除列表对应的值
        my_list.remove(my_list[left])
        my_list.remove(my_list[right])
        everyRight(b[i+1],a)
        i = i+1
except:
    pass

# print(s1)
# print(s2)
# print(a)
# print(len(a))
# print(my_list)

a1 = my_list.index(')')
a2 = my_list.index('(')

try:
    if len(s1) == len(s2) and len(s1) !=0 and a2 < a1:
        print('配对成功')
    else:
        print('配对不成功')
except:
        print('配对不成功')

????????但是还是有错误:

但是我们已经接近正确答案了,改进后的完整代码我会下一篇博客讲解。

原文地址:https://www.cnblogs.com/ITXiaoAng/p/11600978.html

时间: 2024-08-02 01:36:06

python课程单元三编程题讲解(上)的相关文章

python课程第三周 内置数据结构——字典

字典,Python中的无序集合,key-value结构,通过键来访问对应的值,而不是依靠偏移或者索引来访问值.下面是字典的一些基本属性: 字典的value可以是任意值,例如数字.字符串.列表.元组,甚至是字典本身 字典的key必须是可hash的值 字典的key是唯一的 字典没有切片操作,只能通过key来访问value 字典内的元素都是无序存储的 可变长度.异构.任意嵌套 对象引用表:采用最优化的散列算法来查找键,因此键搜索速度非常快,字典存储的是对象引用(而不是拷贝). 字典的初始化: d=di

Python学习笔记(三)编程_Style

语句和语法 *注释 #:可以从一行的任何地方开始 *续行 \: ''':闭合操作符,单一语句跨多行(实现多行注释) *代码组 缩进相同的一组语句构成的一个代码块 首行以关键字开始,如if.while等,以冒号结束 Python使用缩进来分隔代码组,同一代码组的代码行必须严格左对齐,否则会造成语法错误 *同一行放置多个语句 ;:以分号作为分隔符 *模块 每一个Python脚本文件都可以被当成一个模块 模块里的代码可以是一段直接执行的脚本,也可以是一些类似库函数的模块从而在由别的模块执行导入(imp

编程题-线段上格点的个数-最大公约数

线段上格点的个数 给定平面上的两个格点P1(x1,y1)和P2(x2,y2),线段上P1P2上,除P1和P2以外一共有多少格点 虽然可以用穷举法,遍历min(x1,x2)≤x≤max(x1,x2)且min(y1,y2)≤y≤max(y1,y2)的格点可以得到正确答案,但是复杂度确实O(|x1?x2|×|y1?y2|),其实这个题的答案是|x1?x2|和|y1?y2|的最大公约数减去1.(注意,|x1?x2|=0且|y1?y2|=0时,答案为0) 原因,首先看一下|x1?x2|和|y1?y2|的最

python学习_day13___面试模拟真题讲解

一.选择题(32分) 1.python不支持的数据类型有:(A) A.char B.int C.float D.list 2.x = "foo" y = 2 print(x+y)                               (E) A.foo B.foofoo C.foo2 D.2 E.An exception is thrown 解释:不同数据类型不可以相加,但是字符串可以与数字相乘,以上例题若改为print(x*y),结果为B答案 3.关于字符串下列说法错误的是:(

求职 | 华为研发工程师编程题个人题解【C++】【Python】

华为研发工程师编程题[C++][Python][数学][数组][字符串] 问题1 有这样一道智力题:"某商店规定:三个空汽水瓶可以换一瓶汽水.小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?"答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子.然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板.如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝? 输入描述: 输入文件最多包

2. Python面试编程题汇总

编程题 1 台阶问题/斐波纳挈 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. fib = lambda n: n if n <= 2 else fib(n - 1) + fib(n - 2) 第二种记忆方法 def memo(func): cache = {} def wrap(*args): if args not in cache: cache[args] = func(*args) return cache[args] return wrap

C语言的那些题(三) —— 编程计算身高问题

今天,再和大家分享一道关于编程计算身高的问题. 每个做父母的都关心自己孩子成人后的身高,据有关生理卫生知识与数理统计分析表明,影响小孩成人后身高的因素有遗传.饮食习惯与坚持体育锻炼等.小孩成人后身高与其父母身高和自身性别密切相关.设faHeight为其父身高,moHeight为其母身高,身高预测公式为:男性成人时身高 = (faHeight + moHeight) * 0.54(cm),女性成人时身高 = (faHeight * 0.923 + moHeight) / 2(cm),此外,如果喜爱

腾讯2017年暑期实习生编程题【有趣的数字】Python

有趣的数字 时间限制:1秒 空间限制:32768K 题目描述: 小Q今天在上厕所时想到了这个问题:有n个数,两两组成二元组,差最小的有多少对呢?差最大呢? 输入描述: 输入包含多组测试数据. 对于每组测试数据: N - 本组测试数据有n个数 a1,a2...an - 需要计算的数据 保证: 1<=N<=100000,0<=ai<=INT_MAX. 输出描述: 对于每组数据,输出两个数,第一个数表示差最小的对数,第二个数表示差最大的对数. 输入示例: 6 45 12 45 32 5

POJ C程序设计进阶 编程题#4:寻找平面上的极大点

编程题#4:寻找平面上的极大点 来源: POJ (Coursera声明:在POJ上完成的习题将不会计入Coursera的最后成绩.) 注意: 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点(x,y),(a,b),如果说(x,y)支配了(a,b),这是指x>=a,y>=b; 用图形来看就是(a,b)坐落在以(x,y)为右上角的一个无限的区域内. 给定n个点的集合,一定存在若干个点,它们不会被集合中的任何一点所支配,这些点叫做极大值点. 编程找出所有的极大