import re
import sys
class Dup_input:
def __init__(self,str_input):
self.s=str_input
self.l=len(str_input)-1
self.count = (1 if any(x.isupper() for x in str_input) else 0) + \
(1 if any(x.isdigit() for x in str_input) else 0) + \
(1 if any(x.islower() for x in str_input) else 0) + \
(1 if any(re.search('\W', x) for x in str_input) else 0) # 正则表达式判断字符串中有没有其他符号
self.dig_str_flag=1 if (self.count >= 3 and len(self.s) > 8) else 0
@property
def dup_str(self):
self.dup_flag=any(self.s.count(self.s[i:i+2])-1 for i in range(self.l))
return (1,0)[self.dup_flag]
@property
def dig_str_dup(self):
# print(self.dig_str_flag,self.dup_str,self.dig_str_flag + self.dup_str == 2)
return ('NG','OK')[self.dig_str_flag + self.dup_str == 2]
for line in sys.stdin:
line = line.strip('\n')
Foo=Dup_input(line).dig_str_dup
print(Foo)
字符串类型新知识:
# Example:For find index in string,function index has three arguments,
# first one is str you want to find,
# second one is beging find in string,
# the last one is end find index in string
str1 = "this is string example..exam..wow!!!";
str2 = "exam";
print(str1.index(str2))
print(str1.index(str2, 10))
print(str1.index(str2, 20))
print(str1.index(str2, 20,23)) #ValueError: substring not found
# 快速拿到字母部分
# isalpha是用来判断字符不为空且都是由字母构成,才返回True
>>s='AdekA12$DEdehtyt_r'
>>print(list(filter(lambda x:x.isalpha(),list(s))))
['A', 'd', 'e', 'k', 'A', 'D', 'E', 'd', 'e', 'h', 't', 'y', 't', 'r']
#字符串排序,多行输入最终版
import sys
def sorted_str(s):
a=list(filter(lambda x:x.isalpha(),list(s)))
b=sorted(a,key=str.upper)
s_output=''
cn=0
for i in s:
if i.isalpha():
s_output+=b[cn]
cn += 1
else:
s_output +=i
return s_output
while True:
try:
a= sys.stdin.readline().strip()
if a is '':
break
else:
print(sorted_str(a))
except Exception as e:
pass
import re,sys
def fun_sort(str_input):
str_list= re.findall('[a-z]',str_input.upper(), re.I)
str_list.sort()
new_str=''.join(str_list)
str_final=[]
for i in new_str:
cn=new_str.count(i)
if cn>1:
str_find = re.search(i, str_input, re.I).group()
str_input=str_input.replace(str_find,'',1)
str_final.append(str_find)
elif cn==1:
str_find=re.search(i,str_input,re.I).group()
str_final.append(str_find)
return str_final
def spec_str(str_input):
str_output = fun_sort(str_input)
spec_str_dict={}
for i, v in enumerate(str_input):
if v in re.findall('[^a-z]', str_input, re.I):
spec_str_dict[i]=v
str_output.insert(i,v)
print(''.join(str_output))
a=sys.stdin.readline().strip()
spec_str(a)
统计字符
import re
while True:
try:
a=input()
char_num=list(filter(lambda x:x.isalpha(),list(a)))
print(len(char_num))
print(a.count(' '))
dagit_num=re.findall('\d',a)
print(len(dagit_num))
print(len(a)-len(char_num)-a.count(' ')-len(dagit_num))
except:
break
字符统计
题目描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
本题含有多组样例输入
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
知识点:lambda函数;map函数;set()对list去重;list可以返回map函数中的可迭代对象;对多字段升降序。
import sys
while True:
try:
a=input()
str_o=''
if a !='':
char_num=list(set(map(lambda x:(ord(x),x,list(a).count(x)),list(a)))) #set去重
new_char_num=sorted(char_num,key=lambda s:(-s[2],s[0]))
for i in new_char_num:
str_o += i[1]
print(str_o)
else:
pass
except:
break
题目描述
将一个字符中所有的整数前后加上符号“*”,其他字符保持不变。连续的数字视为一个整数。
注意:本题有多组样例输入。
输入描述:
输入一个字符串
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变
import re
import sys
while True:
str_i=sys.stdin.readline().strip()
if str_i:
def repla(x):
return '*'+str(x.group())+'*'
a=re.sub(r'\d+', repla, str_i)
print(a)
else:
break
题目描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数
'''自守数:自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625
import sys
def f1(x):
len_data=len(str(x))
s=str(x**2)
if str(x) == s[len(s)-len_data:]:
return 1
else:
return 0
while True:
try:
data_range = int(sys.stdin.readline().strip())
sum=0
for i in range(data_range+1):
sum += f1(i)
print(sum)
except:
break'''
'''题目描述
输入一个只包含小写英文字母和数字的字符串,按照不同字符统计个数由多到少输出统计结果,如果统计的个数相同,则按照ASCII码由小到大排序输出。
本题含有多组样例输入
输入描述:
一个只包含小写英文字母和数字的字符串。
输出描述:
一个字符串,为不同字母出现次数的降序表示。若出现次数相同,则按ASCII码的升序输出。
import sys
while True:
try:
a=sys.stdin.readline().strip()
str_o=''
if a !='':
char_num=list(set(map(lambda x:(ord(x),x,list(a).count(x)),list(a)))) #set去重
new_char_num=sorted(char_num,key=lambda s:(-s[2],s[0]))
for i in new_char_num:
str_o += i[1]
print(str_o)
else:
pass
except:
break
'''
'''题目描述
输出描述:
字符中所有出现的数字前后加上符号“*”,其他字符保持不变
import re,sys
while True:
str_i=sys.stdin.readline().strip()
if str_i:
def repla(x):
return '*'+str(x.group())+'*'
a=re.sub(r'\d+', repla, str_i)
print(a)
else:
break'''
'''自守数:自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625
import sys
def f1(x):
len_data=len(str(x))
s=str(x**2)
if str(x) == s[len(s)-len_data:]:
return 1
else:
return 0
while True:
try:
data_range = int(sys.stdin.readline().strip())
sum=0
for i in range(data_range+1):
sum += f1(i)
print(sum)
except:
break'''
'''题目描述
查找两个字符串a,b中的最长公共子串。若有多个,输出在较短串中最先出现的那个。
注:子串的定义:将一个字符串删去前缀和后缀(也可以不删)形成的字符串。请和“子序列”的概念分开!
本题含有多组输入数据!
abcdefghijklmnopieabcdefg
abcsafjklmnopqrstuvwjsabcsafj
while True:
try:
a=input()
b=input()
if len(a)>len(b):
a,b=b,a
c=0
d=''
for i in range(len(a)):
print(a[i-c:i+1])
if a[i-c:i+1] in b:
d=a[i-c:i+1]
c+=1
print(d)
except:
break
检测IP合法性
import sys
while True:
a=sys.stdin.readline().strip()
if a:
b=a.split('.')
b=[int(i) for i in b]
if len(b)==4 and max(b)<(2**8) and min(b)>=0:
print('YES')
else:
print('NO')
else:
break
import re
while True:
try:
a,b = input().strip(),input().strip()
a = a.replace("?","\w?").replace(".","\.").replace("*","\w*")
c = re.findall(a,b)
if b in c and len(c) == 1:
print("true")
else:
print("false")
except:
break
'''题目描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
输入描述:
输入一个十六进制的数值字符串。注意:一个用例会同时有多组输入数据,请参考帖子https://www.nowcoder.com/discuss/276处理多组输入的问题。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
方法一:
dic_16={'A':10,'B':11,'C':12,'D':13,'E':14,'F':15}
def hex16_10(a):
b=a[2:]
c=len(b)-1
sum=0
for i,j in enumerate(b):
if j in list(dic_16.keys()):
sum+=dic_16[j]*(16)**(c-i)
else:
sum += int(j) * (16) ** (c - i)
print(sum)
while True:
try:
a=input()
if a[:2]=='0x':
hex16_10(a)
else:
pass
except:
break
方法二'''
while True:
try:
print(int(input(),16))
except:
break
print(int('110',2))
描述
int() 函数用于将一个字符串或数字转换为整型。
语法
以下是 int() 方法的语法:
class int(x(字符类型), base=10)
>> > int() # 不传入参数时,得到结果0
0
>> > int(3)
3
>> > int(3.6)
3
>> > int('12', 16) # 如果是带参数base的话,12要以字符串的形式进行输入,12 为 16进制
18
>> > int('0xa', 16)
10
>> > int('10', 8)
8
字母加密
phone_num={'abc':2,'def':3,'ghi':4,'jkl':5, 'mno':6, 'pqrs':7, 'tuv':8,'wxyz':9}
def f1(a):
out_str = ''
for i in a:
if i==i.upper() and i.isalpha():
if i=='Z':
out_str += 'a'
else:
out_str +=chr(ord(i)+33)
elif i==i.lower() and i.isalpha():
out_str +=str([phone_num[j] for j in phone_num if i in j][0])
else:
out_str += i
return out_str
while True:
try:
a= input()
if a !='':
print(f1(a))
else:
pass
except:
break
字典排序问题:
dict= sorted(dic.items(), key=lambda d:d[1], reverse = True) #按值进行排序
dict= sorted(dic.items(), key=lambda d:d[0]) #d[0] 表示字典的键
题目描述
给出一个名字,该名字有26个字符串组成,定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”,范围在1到26之间。没有任何两个字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个名字,计算每个名字最大可能的“漂亮度”。
本题含有多组数据。
输入描述:
整数N,后续N个名字
输出描述:
每个名称可能的最大漂亮程度
def f1(a):
dic_a={}
for i in set(a):
dic_a[i]=a.count(i)
new_dic=sorted(dic_a.items(), key=lambda d:d[1], reverse = True)
beau_val=26;sum=0
for i,j in new_dic:
sum+=beau_val*j
beau_val-=1
return sum
while True:
try:
n = int(input())
for i in range(n):
print(f1(input()))
except:
break
'''题目描述
找出字符串中第一个只出现一次的字符
输入描述:
输入几个非空字符串
输出描述:
输出第一个只出现一次的字符,如果不存在输出 - 1'''
import sys
while True:
a = sys.stdin.readline().strip()
try:
if a != '':
for j, i in enumerate(a):
num = a.count(i)
if num != 1:
if j + 1 < len(a):
pass
elif j + 1 == len(a) and num == 2:
raise ValueError('None')
else:
print(i)
break
else:
break
except:
print(-1)
合并表
import sys
n=int(input())
list_key=[]
list_value=[]
while n:
str_i=sys.stdin.readline().strip().split(' ')
if int(str_i[0].strip()) in list_key:
i=list_key.index(int(str_i[0].strip()))
list_value[i]+=int(str_i[1].strip())
else:
list_key.append(int(str_i[0].strip()))
list_value.append(int(str_i[1].strip()))
n-=1
a_dict = dict(zip(list_key, list_value))
a_dict = sorted(a_dict.items(),key=lambda x:x[0],reverse=False)
for i in a_dict:
print(i[0],i[1])
高精度整数加法
while True:
try:
a=int(input())
b=int(input())
print(a.__add__(b))
except:
break
蛇形矩阵
from functools import reduce
try:
while True:
n=int(input())
li=[]
for i in range(1,n+1):
li.append(reduce(lambda x, y: x + y, range(1, i + 1)))
print(' '.join(map(str,li)))
for i in range(2,n+1):
li=list(map(lambda x:x-1,li[1:]))
print(' '.join(map(str,li)))
except:
pass
迷宫问题(好好看参数输入的方式)
while True:
try:
r,c = map(int,input().split()) #Remark:row × column
m = [list(map(int, input().split())) for i in range(r)] #Input array data
b=0
for i in range(r):
for j in range(b,c):
if m[i][j] == 0 :
print( '({},{})'.format(i,j) )
b=j
else:
break
except:
break
分别输出小球第5次落地时,共经过多少米第5次反弹多高
height=int(input())
def distance(arg):
sum_dis=0
for i in range(1,arg):
if i==1:
sum_dis +=height
if i<arg:
sum_dis += 2*(height*(0.5)**i)
return sum_dis
print(distance(5))
print(height*(0.5)**5)
挑7(训练题)
try:
while True:
n = int(input())
if n >= 1:
cn = 0
for i in range(n + 1):
if '7' in list(str(i)) or i % 7 == 0 and i > 0:
cn += 1
print(cn)
else:
break
except:
pass
查找组成一个偶数最接近的两个素数
while True:
try:
n=int(input())
if n>=2:
li_o=[]
for i in range(2,n+1):
j=2
while i%j!=0 and j<i :
j+=1
if j==i-1:
li_o.append(i)
li_o_new=[]
for i in li_o:
if n-i in li_o and i<=n-i:
li_o_new.append(i)
print(li_o_new[-1])
print(n-li_o_new[-1])
else:
pass
except:
break
24点游戏
问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利
def point24(m, n):
if n < 1:
return False
elif len(m) == 1:
if m[0] == n:
return True
else:
return False
for i in range(len(m)):
a = m[i]
b = m[:i] + m[i + 1:]
if point24(b, n - a) or point24(b, n + a) or point24(b, n * a) or point24(b, n / a):
return True
while True:
try:
c = list(map(int, input().split()))
if point24(c, 24):
print("true")
else:
print("false")
except:
break
'''题目描述
输入整型数组和排序标识,对其元素按照升序或降序进行排序(一组测试用例可能会有多组数据)
本题有多组输入,请使用while(cin>>)处理
输入描述:
第一行输入数组元素个数
第二行输入待排序的数组,每个数用空格隔开
第三行输入一个整数0或1。0代表升序排序,1代表降序排序
输出描述:
输出排好序的数字'''
知识点:.join拼接必须可迭代对象里也是字符类型,才能拼接成字符串
while True:
try:
n=int(input())
a=list(map(int,input().strip().split()))
m=int(input())
if n==len(a):
sor_flag=(True,False)[m==0]
b=sorted(a,reverse=sor_flag)
print(' '.join(map(str,b)))
except:
break
题目描述
首先输入要输入的整数个数n,然后输入n个整数。输出为n个整数中负数的个数,和所有正整数的平均值,结果保留一位小数。
本题有多组输入用例。
输入描述:
首先输入一个正整数n,
然后输入n个整数。
输出描述:
输出负数的个数,和所有正整数的平均值。
注意:正数和负数都不包含0,还有保留几位小数的格式
while True:
try:
n=int(input())
li_i=list(map(int,input().strip().split()))
if n==len(li_i):
li_o_positive=list(filter(lambda x:x==abs(x) and x !=0,li_i))
li_o_negative=list(filter(lambda x:x==-abs(x) and x !=0,li_i))
print(len(li_o_negative),'{:.1f}'.format(sum(li_o_positive)/len(li_o_positive)))
except:
break
题目描述:走方格的方案数
请计算n*m的棋盘格子(n为横向的格子数,m为竖向的格子数)沿着各自边缘线从左上角走到右下角,总共有多少种走法,要求不能走回头路,即:只能往右和往下走,不能往左和往上走。
本题含有多组样例输入。
输入描述:
每组样例输入两个正整数n和m,用空格隔开。(1≤n,m≤8)
输出描述:
每组样例输出一行结果
def func(n,m):
if n==0 or m==0:
return 1
else:
return func(n-1,m)+func(n,m-1)
while True:
try:
n, m = map(int, input().split())
print(func(n, m))
except:
break
输入一个字符串,返回其最长的数字子串,以及其长度
import re
def filter_len(x):
if len(x)==max_num:
return str(x)
while True:
try:
a=input()
if a !='':
b=re.findall('\d+',a)
max_num=max(list(map(lambda x:len(x),b)))
print('{},{}'.format(''.join(list(filter(filter_len,b))),max_num))
else:
break
except:
break
密码强度等级判断
import re
while True:
try:
password=input()
if password !='':
a=re.findall('[\d]',password);b=re.findall('[a-z]',password)
c=re.findall('[A-Z]',password);d=re.findall('[\W]',password);e=re.findall('[a-z,A-Z]',password)
score_len=(5 if len(password)<=4 else (10 if 4<len(password)<=7 else 25))
score_isdigit=(0 if len(a)==0 else (10 if len(a)==1 else 20))
score_ischar=(0 if len(e)==0 else (10 if password.islower() or password.isupper() else 20))
score_symb=(0 if len(d)==0 else (10 if len(d)==1 else 25))
def score_reward():
if len(a)>0 and ((len(b)>0 and len(c)==0) or (len(b)==0 and len(c)>0))and len(d)==0:
return 2
elif len(a)>0 and ((len(b)>0 and len(c)==0) or (len(b)==0 and len(c)>0)) and len(d)>0:
return 3
elif len(a)>0 and len(b)>0 and len(c)>0 and len(d)>0:
return 5
else:
return 0
score=score_len+score_isdigit+score_ischar+score_symb+score_reward()
if score>=90:print('VERY_SECURE')
elif 80<=score<90:print('SECURE')
elif 70<=score<80:print('VERY_STRONG')
elif 60<=score<70:print('STRONG')
elif 50<=score<60:print('AVERAGE')
elif 25<=score<50: print('WEAK')
else:print('VERY_WEAK')
else:
break
except:
break
给定一个仅包含小写字母的字符串,求它的最长回文子串的长度。
while True:
try:
a=input()
if a!='':
b=a[::-1]
m=0;
c= ''
for i in range(len(a)):
if a[m:i] in b:
c=a[m:i]
else:
m+=1
print(len(c))
except:
break
判断短字符串中的所有字符是否在长字符串中全部出现。
while True:
try:
a = input()
b = input()
if a != '' and b != '':
print('true' if all(list(map(lambda x:x in b,a))) else 'false')
else:
break
except:
break
四则运算
输入一个表达式(用字符串表示),求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘+’,‘-’, ‘*’,‘/’ ,‘(’, ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
s = input()
s = s.replace('{', '(')
s = s.replace('}', ')')
s = s.replace('[', '(')
s = s.replace(']', ')')
print(int(eval(s)))
给定一个字符串描述的算术表达式,计算出结果值。
print(eval(input()))
'''题目描述
题目描述
完全数(Perfect number),又称完美数或完备数,是一些特殊的自然数。
它所有的真因子(即除了自身以外的约数)的和(即因子函数),恰好等于它本身。
例如:28,它有约数1、2、4、7、14、28,除去它本身28外,其余5个数相加,1+2+4+7+14=28。s
输入n,请输出n以内(含n)完全数的个数。计算范围, 0 < n <= 500000
本题输入含有多组样例。
输入描述:
输入一个数字n
输出描述:
输出不超过n的完全数的个数'''
while True:
try:
m= int(input())
cn=0
for n in range(1,m):
# print(n)
i=1;l=[]
while i<n:
if n%i==0:
l.append(i)
i+=1
else:
i+=1
if sum(l)==n:
cn+=1
print(cn)
except:
break
'''题目描述
输入一个正整数,计算它在二进制下的1的个数。
注意多组输入输出!!!!!!
输入描述:
输入一个整数
输出描述:
计算整数二进制中1的个数
示例1
输入
复制
5
输出
复制
2
说明
5的二进制表示是101,有2个1 '''
while True:
try:
n = int(input())
c = ''
while n:
a, b = n.__divmod__(2)
c += str(b)
n = a
print(c[::-1].count('1'))
except:
break
DNA序列
while True:
try:
a=input()
b=int(input())
c=[];d=[]
for i in range(len(a)-b+1):
substr=a[i:i+b]
subcn=substr.count('G')+substr.count('C')
c.append(substr);d.append(subcn)
for i,j in enumerate(d):
if j==max(d):
print(c[i])
break
except:
break
百钱买百鸡
try:
while int(input()):
a=100
b,c,d=5,3,1/3
for x in range(int(a/b)+1):
for y in range(int(a/c)+1):
for z in range(int(a/d)+1):
if x*b+y*c+z*d==100 and x+y+z==100:
print(x,y,z)
except:
pass
根据输入的日期,计算是这一年的第几天
import calendar,re
while True:
try:
year,month,date=map(int,input().strip().split())
cn=0
for m in range(1,month+1):
if m <month:
calen=calendar.month(year,m)
a=list(filter(lambda x:len(x)<=2,re.findall('\d+',calen)))
cn+=len(a)
else:
cn+=date
print(cn)
except:
break
矩阵乘法
while True:
try:
x,y,z=int(input()),int(input()),int(input())
A=list(list(map(int,input().split())) for i in range(x))
B=list(list(map(int,input().split())) for j in range(y))
li = [[] for i in range(len(A))]
for i in range(x): # A行
for j in range(z): #B列
sum = 0
for k in range(y): #A列,B行
sum += A[i][k]*B[k][j] #循环进行进行矩阵乘法(A行*B列)
li[i].insert(j, sum)
for i in range(x):
print(' '.join(list(map(str,li[i]))))
except:
break
放苹果【递归和动态规划】
def putApple(m, n):
if m == 0 or n == 1:
return 1
if n > m:
return putApple(m, m)
else:
return putApple(m, n - 1) + putApple(m - n, n)
while True:
try:
n, m = map(int, input().split())
print(putApple(n, m))
except:
break