《编程刷题奇遇:从十六进制转换到信用卡号验证,解锁代码世界的谜题》

一、问答题

(1)假设给定如下s1、s2、s3和s4四个字符串:

s1 = "Welcome to Python"
s2 = s1
s3 = "Welcome to Python"
S4 = "to"

# 下面表达式的结果是什么?
a.s1 == s2						l.4 * S4	
b.s2.count('o')					m.len(s1)
c.id(s1) == id(s2)				n.max(s1)
d.id(s1) == id(s3)				o.min(s1)
e.s1 <= s4						p.s1[-4]
f.s2 >= s4						q.s1.1ower()
g.s1 != s4						r.s1.rfind('o')
h.s1.upper()					s.s1.startswith("o")
i.s1.find(s4)					t.s1.endswith("o")
j.s1[4]							u.s1.isalpha()
k.s1[4 :8]						v.s1 + s1	

a: True l: totototo

b: 3 m: 17

c: True n: y

d: True o: P

e: True p: t

f: False q:welcom to python

g: True r : 15

h: WELCOME TO PYTHON s: False

i: 8 t: False

j: o u: False #存在空格

k: ome v: Welcome to PythonWelcome to Python

(2)假设s1和s2是两个字符串,下面哪个语句或表达式是错误的?

s1 = "programming 101"
s2 = "programming is fun"
s3 = s1 + s2
s3 = s1 - s2
s1 == s2
s1 >= s2
i = len(s1)
c = s1[0]
t = s1[:5]
t = s1[5:]

s3 #字符串类型的数据不能做减操作

(3)下面代码输出内容是什么?

s1="Welcome to Python"
s2 = s1.replace("o","abc")
print(s1)
print(s2)

Welcome to Python

Welcabcme tabc Pythabcn

(4)假如运行下面程序的时候输入A。那么输出什么?

x = input("Enter a character:")
ch = chr(ord(x) + 3)
print(ch)

d

(5)假如运行下面的程序的时候输入A和Z。那么输出什么?

x= input("Enter a character:")
y= input("Enter a character:")
print(ord(y) - ord(x))

25

二、编程题

(6)十六进制转十进制【录制讲解】

视频链接:录制: 录制2
录制文件:https://meeting.tencent.com/crm/2OGDqRX03e

题目描述

输入一个十六进制字符串,输出其对应的十进制数字

输入输出描述

输入一个十六进制字符串

输出十进制数字

示例

输入:

1e1b9

输出:

123321

s = input()
#用切片把字符串反转
s = s[::-1]
the_sum = 0
for i in range(len(s)):
    if s[i].isdigit():
        the_sum += int(s[i]) * 16 ** i
    else:
        the_sum += (ord(s[i]) - 87) * 16 ** i
print(the_sum)

#不想翻转的情况
s = input()
total_sum = 0
for i in range(len(s)):
   if s[len(s) - 1 - i].isdigit():
        total_sum += int(s[len(s) - 1 - i]) * 16 ** i
    else:
        total_sum += (ord(s[len(s) - 1 - i]) - 87) * 16 ** i
print(total_sum)

#偷懒方法使用内置函数int
s = input()
print(int(s, 16))

(7)检测密码

题目描述

一些网站会给密码强加一些规则:

(1)密码必须至少有8个字符

(2)密码只能包含英文字母和数字

(3)密码应该至少包含两个数字

(4)密码应该至少包含两个大写字母

如果密码符合规则,输出Yes;否则输出No

输入输出描述

输入一串密码

输出该密码是否符合规则

示例1

输入:

123456a

输出:

No

示例2

输入:

123abcABC

输出:

Yes

#密码检测
#思路1 用字典
def password(s):
    if len(s) < 8:
        return False
    dic = dict()
    dic = {'english':0, 'number':0, 'other':0}
    for letter in s:
        #判断这个字符是否是字母
        if letter.isalpha():
            dic['english'] += 1
        #判断这个字符是否是数字
        elif letter.isdigit():
            dic['number'] += 1
        else:
            dic['other'] += 1
    if dic['english'] < 2 or dic['number'] < 2 or dic['other'] > 0:
        return False
    return True
s = input()
if password(s):
    print('Yes')
else:
    print('No')
    
#思路二用集合
def password(s):
    if len(s) < 8:
        return False
    #把源字符串生成集合
    s = set(s)
    letter = set()
    #将letter集合中添加所有的大小写字母
    for i in range(26):
        letter.add(chr(i + 97))
        letter.add(chr(i + 65))
    #num集合里面添加所有可以输入的数字
    num = set('123456789')
    #取差集,确保集合s中只有字母和数字,否则就返回False
    if len(s - (letter | num)) > 0:
        return False
    #最后取交集确定集合s中至少有字母2个和数字2个
    return len(s & letter) >= 2 and len(s & num) >= 2
s = input()
if password(s):
    print('Yes')
else:
    print('No')

(8)相似词【录制讲解】

**视频链接:**录制: 录制4
录制文件:https://meeting.tencent.com/crm/2jkDjYMJb6

题目描述

输入两个英文单词,判断其是否为相似词,所谓相似词是指两个单词包含相同的字母

输入输出描述

输入两行,分别表示两个单词

输出结果,为相似词输出YES,否则输出NO

示例

输入:

listen

silent

输出:

YES

#思路1
"""
遍历word1
然后挨个判断每个字母是否在word2中
"""
word1 = input()
word2 = input()
for letter in word1:
    if letter in word2:
        print('YES')
        break
else:
    print('NO')
#思路2 集合
word1 = set(input().lower())
word2 = set(input().lower())
#有交集说明有相同字母
if word1 & word2:
    print('YES')
else:
    print('NO')

(9)找出基因

生物学家使用字母A、C、T和G构成的字符串模拟一个基因组。一个基因是基因组的一个子串,它从三元组ATG后开始并在三元组TAG、TAA或TGA之前结束。此外,基因字符串的长度是3的倍数,而且基因不包含三元组ATG、TAG、TAA和TGA。

编写程序提示用户输入一个基因组,然后显示基因组里的所有基因。如果输入序列中没有找到基本,那么程序显示“未发现任何基因”。

示例1

输入:TTATGTTTTAAGGATGGGGGGTTAGTT

输出:

TTT

GGGGGT

示例2

输入:TGTGTGTATAT

输出:

未发现任何基因

#输入基因组序列
s = input()
genes = []
start = 0
#合法字符集
valid_chars = {'A', 'C', 'T', 'G'}
while True:
    start = s.find('ATG', start)
    #没找都基因组
    if start == -1:
        break
    #基因组开始的位置跳过ATG
    start += 3
    last = ['TAG', 'TAA', 'TGA']
    #查找最近的三元组
    min_end = len(s)
    for mapper in last:
        end = s.find(mapper, start)
        if end != -1 and end < min_end:
            min_end = end
    #找不到终止三元组        
    if min_end == len(s):
        break
    #提取候选基因
    candidate = s[start: min_end]
    # print(len(candidate))
    #检查(基因长度是否为3的倍数,并且不包含禁止的三元组
    if len(candidate) % 3 == 0:
        forbidden = ['ATG', 'TAG', 'TAA', 'TGA']
        valid = True
        if not all(c in valid_chars for c in candidate):
            valid = False
        for i in range(0, len(candidate), 3):
            if candidate[i:i+3] in forbidden:
                valid = False
                break
        if valid:
            genes.append(candidate)
if not genes:
    print('未发现任何基因')
else:
    for gene in genes:
        print(gene)

(10)手机键盘【录制讲解】

**视频链接:**录制: 录制5
录制文件:https://meeting.tencent.com/crm/29BD531432

手机的国际标准字母/数字对应键盘如下(九宫格输入法):

image-20250423092904104

编写程序,当用户想输入一段信息时(包含字母、数字、空格,忽略字母大小写),他需要按哪些键?

示例1

输入:My name is bob and I am 18 years old

输出:690626304702620263040260180932770653

#手机键盘
digit_to_letters = { 
    '2' : 'abc',
    '3' : 'def',
    '4' : 'ghi',
    '5' : 'jkl',
    '6' : 'mno',
    '7' : 'pqrs',
    '8' : 'tuv',
    '9' : 'wxyz',
    '0' : ' ',
    '↑' : '*',
    '*' : '+'
}
#生成字母到数字的反向映射字典(字母为键数字为值)
letter_to_digit = {}
for digit, letters in digit_to_letters.items():
    for letter in letters:
        letter_to_digit[letter] = digit

s = input().lower()
result = []
#遍历用户输入的字符串
for char in s:
    #如果在映射字典里就添加对应的数字键
    if char in letter_to_digit:
        result.append(letter_to_digit[char]) 
    #如果是数字字符直接保留
    elif char.isdigit():
        result.append(char)
#用join将列表中的字符串连接起来
print(''.join(result))

(11)信用卡号的合法性

信用卡号遵循下面的模式:一个信用卡号必须是13位到16位的整数,它的开头必须是:

  • 4 是指Visa卡
  • 5 是指Master卡
  • 37 是指 American Express卡
  • 6 是指Discover卡

现有一个验证信用卡号是否有效的检测算法,Luhn检测或Mod10检测,它的检测原理如下:

假设一个卡号:4388576018402626

(1)从左到右对奇数位置的数字进行 ×2 操作,如果结果为两位数,则将两位数加在一起得到一个一位数

4 8 5 6 1 4 2 2
4 * 2 = 8
8 * 2 = 16 (1 + 6 = 7)
5 * 2 = 10 (1 + 0 = 1)
6 * 2 = 12 (1 + 2 = 3)
1 * 2 = 2
4 * 2 = 8
2 * 2 = 4
2 * 2 = 4

(2)将第一步得到的所有一位数相加

8 + 7 + 1 + 3 + 2 + 8 + 4 + 4 = 37

(3)将卡号从右到左在奇数位置上的数字相加

6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38

(4)将第二步与第三步的结果相加

37 + 38 = 75

(5)如果第四步的结果能被10整除,那么卡号就是合法的;否则卡号不合法。

例如:438857601840707是合法的

编写程序,输入一个卡号,判断其合法性。

#信用卡号的合法性
def is_law(digit):
    if len(digit) < 13 or len(digit) > 16:
        return False
    #如果不是以这些数字开头就直接返回False
    if not digit.startswith(('4', '5', '37', '6')):
        return False
    #第一步
    the_sum = 0
    for i in range(0, len(digit), 2):
        by = int(digit[i]) * 2
        if by > 9:
            the_sum += (by % 10 + by // 10)
        else:
            the_sum += by
    #第二步
    two_sum = 0
    for i in range(len(digit) - 1, -1, -2):
        two_sum += int(digit[i])
    if (the_sum + two_sum) % 10 == 0:
        return True
    else:
        return False
digit = input()
if is_law(digit):
    print('合法')
else:
    print('不合法')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值