文章目录
- 1. a + b
- 题目
- 示例
- 解析
- 运行结果:
- 2. 列表排序
- 题目
- 示例
- 解析
- 3. 字符串逆序
- 题目
- 解析
- 4. 输出字典key
- 题目
- 解析
- 5. 输出字符奇数位置的字符串
- 题目
- 解析
- 6. 求解100以内的所有的素数
- 题目
- 解析
- 7. 求矩形面积
- 题目
- 解析
- 8. 求中位数
- 题目
- 解析
- 9. 最大公约数
- 题目
- 解析
- 10. 最小公倍数
- 题目
- 解析
- 11. 结尾0的个数
- 题目
- 解析
- 12. 结尾非零数的奇偶性
- 题目
- 解析
- 13. 二进制1的个数
- 题目
- 解析
- 14. Python之美
- 题目
- 解析
- 15. 大小写转换
- 题目
- 解析
- 16. 人民币金额大写打印
- 题目
- 解析
- 17. 公约数的个数
- 题目
- 解析
- 18. 逆解最大公约数与最小公倍数
- 题目
- 解析
- 19. 单身情歌
- 题目
- 解析
- 20. 信息加密
- 题目
- 解析
1. a + b
题目
给你两个数a、b,请你计算它们的和,并输出。
例如: a = 3, b = 2
则输出:5
示例
输入:a = 1 b = 2
输出:3
解析
直接print(a+b)即可
a = 2
b = 5
def solve_it():
return a+b #your answer
print(solve_it()) # 答案需要输出
运行结果:
7
2. 列表排序
题目
给你一个列表 L, 对L进行升序排序并输出排序后的列表。
例如:L = [8,2,50,3]
则输出:[2,3,8,50]
示例
输入:L = [4, 2, 25, 7777777, 100, 3, 77777777, 77777777, 77777777, 77777777]
输出:[2, 3, 4, 25, 100, 7777777, 77777777, 77777777, 77777777, 77777777]
解析
list.sort()
默认正序排列,原地排序,会修改list的值listSorted = sorted(list)
默认正序排列,不改变原来的列表,会创建一个新的列表存放排序后的结果
L = [8, 2, 50, 3, 4, 7]
def solve_it():
L.sort()
return L # your answer
def solve_it_2():
LSorted = sorted(L)
return LSorted
print(solve_it()) # 答案需要输出
结果:
3. 字符串逆序
题目
给你一个字符串 a, 请你输出逆序之后的a。
例如:a=‘xydz’
则输出:zdyx
解析
- 字符串逆序,使用切片[::-1]
- 使用
for
循环倒叙遍历插入的方式- 正序遍历然后从前面插入的方式
a = "abcdefg"
def solve_it():
return a[::-1]
def solve_it_2():
newA = ""
for i in range(len(a) - 1):
newA += a[(len(a) - 1 - i)]
return newA
def solve_it_3():
newA = []
for c in a:
newA.insert(0,c)
newA = "".join(newA)
return newA
print(solve_it()) # 答案需要输出
结果:
4. 输出字典key
题目
给你一字典a,如a={1:1,2:2,3:3},输出字典a的key,以’,‘连接,如‘1,2,3’。要求key按照字典序升序排列(注意key可能是字符串)。例如:a={1:1,2:2,3:3}, 则输出:1,2,3
解析
dict.keys()
可以获取所有的keys- 对
keys
进行排序- 使用",".join()拼接
a = {1:1,2:2,3:3}
def solve_it():
res = ",".join([str(x) for x in sorted(a.keys())])
return res
print(solve_it()) # 答案需要输出
结果:
5. 输出字符奇数位置的字符串
题目
给你一个字符串 a, 输出a中奇数位置字符构成的字符串(位置编号从1开始)。
例如:a=‘xyzwd’
则输出:xzd
解析
- 遍历字符串,索引开始为1,当index % 2 != 0的时候输出
- 遍历字符串,索引从0开始,当索引+1 % 2 != 0的时候输出
- 直接使用切片,每隔两个取一个字符
a = "0123456789"
def solve_it():
return a[::2]
def solve_it_2():
newA = ""
for index, c in enumerate(a, start=1):
if index % 2 != 0:
newA += c
return newA
def solve_it_3():
newA = ""
for i in range(len(a) - 1):
if (i + 1) % 2 != 0:
newA += a[i]
return newA
print(solve_it()) # 答案需要输出
结果:
6. 求解100以内的所有的素数
题目
输出100以内的所有素数,素数之间以一个空格区分(注意,最后一个数字之后不能有空格)。
解析
- 素数的判定,对于大于一的整数,除了1和它本身,不能被其他的自然数整除
- 将结果用
" "
字符串拼接即可
def solve_it():
res = []
for i in range(100):
if i >= 2:
for j in range(2,i):
if i % j == 0:
break
else:
res.append(str(i))
return " ".join(res)
print(solve_it()) # 答案需要输出
结果:
7. 求矩形面积
题目
已知矩形长a,宽b,输出其面积和周长,面积和周长以一个空格隔开。
例如:a = 3, b = 8
则输出:24 22
解析
- 矩形面积 a*b
- 矩形的周长 2 * (a + b)
a = 10
b = 20
def solve_it():
return " ".join([str(x) for x in [a * b, (a + b) * 2]])
print(solve_it()) # 答案需要输出
结果:
8. 求中位数
题目
给你一个整数列表L, 输出L的中位数(若结果为小数,则保留一位小数)。
例如: L=[0,1,2,3,4]
则输出:2
解析
- 首先是排序,按照从小到大进行排序
- 如果是奇数,中位数的索引就相当于是 len(L) // 2
- 如果是偶数,中位数是中间的两个数的均值 len(L) // 2 -1 以及 len(L) // 2
# 参考代码,如嫌啰嗦,建议删除,一行搞定
L = [0, 1, 8, 3, 4, 5]
def solve_it():
L.sort()
if len(L) % 2 == 0:
indexMiddle1 = len(L) // 2 - 1
indexMiddle2 = len(L) // 2
res = round((L[indexMiddle1] + L[indexMiddle2]) / 2, 2)
else:
indexMiddle = len(L) // 2
res = round(L[indexMiddle], 2)
return res
print(solve_it()) # 答案需要输出
结果:
9. 最大公约数
题目
给你两个正整数a和b, 输出它们的最大公约数。
例如:a = 3, b = 5
则输出:1
解析
- 先排序a,b 使得 a > b
- a 对 b取余,如果b可以被a整除,那么最大的公约数就是b
- 如果a对b取余的结果不是0,而是c,则a和b的最大公约数和 b和c中间的最大公约数是相等的
- 利用循环直到a%b的余数是0的时候退出
a = 10
b = 15
def solve_it():
if a < b:
x,y = b,a
else:
x,y = a,b
while y:
x,y = y,x%y
return x #your answer
print(solve_it()) # 答案需要输出
结果:
10. 最小公倍数
题目
给你两个正整数a和b, 输出它们的最小公倍数。
例如:a = 3, b = 5
则输出:15
解析
最小公倍数就是乘积除以最大公约数
a = 10
b = 15
def solve_it():
# 先求最大公约数
if a > b:
x, y = a, b
else:
x, y = b, a
while y:
x, y = y, x % y
res = a * b // x
return res # your answer
print(solve_it()) # 答案需要输出
结果:
11. 结尾0的个数
题目
给你一个正整数列表 L, 输出L内所有数字的乘积末尾0的个数。(提示:不要直接相乘,数字很多,相乘得到的结果可能会很大)。
例如: L=[2,8,3,50],
则输出:2
解析
- 注意2和5相乘的结果是10,所以乘积的末尾0的个数,其实就是求有几对2和5
- 先把这个数拆分成2的倍数,看看有几个2,再拆分成5的倍数,看看有几个5
- 最后求2的个数和5的个数的最小值即可
L = [4, 2, 25, 7777777, 100, 3, 77777777, 77777777, 77777777, 77777777]
def solve_it():
count2 = 0
count5 = 0
for x in L:
while True:
if x % 2 == 0:
x /= 2
count2 += 1
elif x % 5 == 0:
x /= 5
count5 += 1
else:
break
return min(count2,count5)
print(solve_it()) # 答案需要输出
结果:
12. 结尾非零数的奇偶性
题目
给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性。如果为奇数输出1,偶数则输出0.。
例如:L=[2,8,3,50]
则输出:0
解析
- 先做乘积
- 然后就是倒序遍历,找到非零数字
- 判断奇偶性
L = [2,8,3,50]
def solve_it():
product = 1
for i in L:
product *= i
# 转换为字符串
for c in str(product)[::-1]:
if c != "0":
if int(c) % 2 == 0:
res = 0
else:
res = 1
break
else:
res = 0
return res #your answer
print(solve_it()) # 答案需要输出
结果:
13. 二进制1的个数
题目
光棍们对1总是那么敏感,因此每年的11.11被戏称为光棍节。小Py光棍几十载,光棍自有光棍的快乐。让我们勇敢地面对光棍的身份吧,现在就证明自己:给你一个整数a,数出a在二进制表示下1的个数,并输出。
例如:a=7
则输出:3
解析
bin(number, /)
: Return the binary representation of an integer,返回一个整数的二进制字符串形式bin(123)
=> ‘0b1111011’,返回一个字符串,并且是0b开头,会去除掉前面的0
a = 123456
def solve_it():
b = bin(a)[2:]
return b.count("1")
print(solve_it()) # 答案需要输出
结果:
14. Python之美
题目
输出Python之禅。
注意:输出python之禅的源码即可,不要转换为英文。(小小的提示:print this.s)
解析
- Python之禅的源码在this模块的s字符串,它里面转换成了英文并且打印了一次
- 如果想要输出未转换的python之禅,直接打印this.s即可
import this
def solve_it():
return this.s
print(solve_it()) # 答案需要输出
15. 大小写转换
题目
给定一个字符串a, 将a中的大写字母 转换成小写,其它字符不变,并输出。
例如:a=“aaaaaabbbDDDDD”
则输出:aaaaaabbbddddd
解析
- isupper()判断是否是大写
- 或者是 ord(“A”) <= ord(“c”) <= ord(“Z”) 是大写
a = "aaaaaabbbDDDDD"
def solve_it():
newA = ""
for c in a:
if c.isupper():
c = c.lower()
newA += c
return newA # your answer
print(solve_it()) # 答案需要输出
结果:
16. 人民币金额大写打印
题目
银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万
以下的例子示范了阿拉伯数字到人民币大写的转换规则:
1 壹圆
11 壹拾壹圆
111 壹佰壹拾壹圆
101 壹佰零壹圆
-1000 负壹仟圆
1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆
现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.
例如:a=1
则输出:壹圆
Unicode编码可以通过如下方式获得:u’壹’。
注意:代码无需声明编码!!不要在代码头部声明文件编码,否则会导致语法错误!
解析
- 第一步是判断正负
- 然后是遍历这个数,因为一共是9位数,不超过1个亿,所以单位上有8个.
- 先将对应位的单位全部写上去
- 去除掉零千,零白,零十,然后将3个零,两个零合并成为1个,如果有零万,就改成万,零圆就改成圆
a = -11234567
def solve_it():
'''
pythontip oj不同于传统oj,代码里面直接使用变量,无需要提前声明,免去复杂的输入解析
life is short, so i user python~
you can use variables a
'''
digit = [u'零',u'壹',u'贰',u'叁',u'肆',u'伍',u'陆',u'柒',u'捌',u'玖']
units = [u'圆',u'拾',u'佰',u'仟',u'万',u'拾',u'佰',u'仟']
if a < 0:
res = "负"
else:
res = ""
b = str(abs(a))
for index,c in enumerate(b):
unit = units[len(b)-index-1]
number = digit[int(c)]
res += number
res += unit
re = [(u'零仟', u'零'), (u'零佰', u'零'), (u'零拾', u'零'), (u'零零零', u'零'), (u'零零', u'零'), (u'零万', u'万'), (u'零圆', u'圆')]
for s1,s2 in re:
res = res.replace(s1,s2)
res = res if a != 0 else u"零圆"
return res # your answer
print(solve_it()) # 答案需要输出
结果:
17. 公约数的个数
题目
给你两个正整数a,b, 输出它们公约数的个数。
例如:a = 24, b = 36
则输出:6
解析
- 算出来两个数的所有的约数
- 求集合的交集大小
a = 24
b = 36
def solve_it():
aSet = set()
bSet = set()
for i in range(1,a+1):
if a % i == 0:
aSet.add(i)
for i in range(1,b+1):
if b % i == 0:
bSet.add(i)
return len(aSet & bSet) # your answer
print(solve_it()) # 答案需要输出
结果:
18. 逆解最大公约数与最小公倍数
题目
我们经常遇到的问题是给你两个数,要你求最大公约数和最小公倍数。今天我们反其道而行之,给你两个数a和b,计算出它们分别是哪两个数的最大公约数和最小公倍数。输出这两个数,小的在前,大的在后,以空格隔开。若有多组解,输出它们之和最小的那组。注:所给数据都有解,不用考虑无解的情况。
例如:a=3, b = 60
则输出:12 15
解析
- 最小公倍数 b = 60,最大公约数 a = 3,可以推测 x * y = 180
- 所以求出来(1,60)之间所有可以被3整除的数,并且还是60的因子,两个数同时满足即是3的倍数,又是60的因子.从大到小遍历,遇到满足的就是.
a = 3
b = 60
resList = []
def solve_it():
for i in range(b + 1, 1, -1):
if i % 3 == 0 and b % i == 0:
if a * b % i != 0:
continue
else:
j = int(a * b / i)
if j % 3 == 0 and b % j == 0:
res = min(i, j), max(i, j)
resList.append(res)
resListSorted = sorted(resList, key=lambda x: sum(x))
return " ".join([str(x) for x in resListSorted[0]]) # your answer
print(solve_it()) # 答案需要输出
结果:
19. 单身情歌
题目
抓不住爱情的我 总是眼睁睁看它溜走 …现在来练习一下发现爱的能力,给你一个字符串a,如果其中包含"LOVE"(love不区分大小写)则输出LOVE,否则输出SINGLE。
例如:a = “OurWorldIsFullOfLOVE”
则输出:LOVE
解析
- 直接使用 “s” in string 即可判定这个字符串中是否存在
- 因为忽略大小写,可以将a转换为全大写即可
a = "OurWorldIsFullOfLOVE"
def solve_it():
aUpper = a.upper()
if "LOVE" in aUpper:
res = "LOVE"
else:
res = "SINGLE"
return res # your answer
print(solve_it()) # 答案需要输出
20. 信息加密
题目
给你个小写英文字符串a和一个非负数b(0<=b<26), 将a中的每个小写字符替换成字母表中比它大b的字母。这里将字母表的z和a相连,如果超过了z就回到了a。
例如a=“cagy”, b=3,
则输出 :fdjb
解析
- 首先是通过ord(a) + b,计算结果,如果超过了z,要看看其对z取的余数是多少
- 如果刚好是z,余数就是0,如果余数是1,那就是a,以此类推
- 所以应该是[ord(a) + b - ord(“a”)] % 26 + ord(a)
- 因为一共是26个字母,所以这里就根据它和a的差值,26一个循环
a="cagy"
b = 3
def solve_it():
aNew = ""
for c in a:
cNew = (ord(c) + b - ord("a")) % 26 + ord("a")
aNew += chr(cNew)
return aNew # your answer
print(solve_it()) # 答案需要输出
结果: