这次作业终于碰到需要思考的题目了(呜呜呜
1. DNA匹配A
【问题描述】编写与字符串对象的find方法功能相似的函数find(srcString, substring, start, end),作用是在srcString串的下标start到下标end之间的片段中寻找subString串的第一次出现的位置,返回该位置值;如果没找到,返回-1。
编写程序,输入源串和子串,检验find(someString, substring,start,end)是否正确。
【输入形式】按照somestrig,substring,start,end的顺序输入,各成分之间由空格隔开。Somestring和substring均由A/T/C/G四个字母组成。start和end由自然数构成。
【输出形式】当匹配成功时,输出子串在DNA字符串的位置,以子串第一个字母在DNA字符串中匹配位置的下标;当匹配失败时,输出-1。
【样例输入】ATCGGCGCGGCGT CGG 0 10
【样例输出】2
【样例说明】下标从0开始计数。
看到这道题目到时候就笑了,这不是Leetcode上的那道实现strStr()嘛,我还写过题解,其实这题应该是一题KMP问题,但是我还是暴力解了一下。
代码如下:
string = input().split(" ")
# print(string)
somestring = string[0]
substring = string[1]
start = int(string[2])
end = int(string[3])
#['ATGATGGAGGTACCCCA', 'GGA', '0', '10']
#['ATCGGCGCGGCGT', 'CGG', '0', '10']
#['TGGATGCGTAGTAAAA', 'GAG', '0', '5']
somestring = somestring[start:end]
if substring not in somestring:
print("none")
else:
for i in range(len(somestring)):
if somestring[i:i+len(substring)] == substring:
print(i, end = ",")
2. 亲密数
【问题描述】
求整数n以内(含n)的全部亲密数。
说明:如果正整数A的全部因子(包括1,不包括A本身)之和
等于B;且正整数B的全部因子(包括1,不包括B本身)
之和等于A,则将正整数A和B称为亲密数。
1不和其他数形成亲密数。
【输入形式】
输入整数n
【输出形式】
每一行输出一对亲密数,中间用一个空格隔开。
每一对亲密数只输出一次,小的在前。
各对亲密数按序排序,按亲密数中小的那个数从小到大排序。
【样例输入】
3000
【样例输出】
220 284
1184 1210
2620 2924
这题其实也很简单,我按照素数筛的思路,也做了一次筛法打表(虽然交题目的平台上感觉时间复杂度放的很宽),不过这样做应该算是比较快的做法,代码如下
def dabiao(num_list):
max_num = 100000000
for i in range(2,m//2):
for j in range(2,max_num):
if i*j <= m:
num_list[i*j] += i
else:
break
return num_list
def dsort(a,b):
if b>=a:
return a,b
else:
return b,a
m = int(input())
num_list = [1]*(m+1)
num_list = dabiao(num_list)
for i in range(2,m+1):
try:
if num_list[num_list[i]] == i and num_list[i] != i:
a = dsort(num_list[i],i)
print(a[0],a[1])
num_list[i] = 1
except:
continue
3. 整数的N进制字符串表示
【问题描述】
编写函数itob(n,b),用于把整数n转换成以b为基底的字符串并返回.
编写程序,使用函数itob(n,b)将输入的整数n,转换成字符串s,将s输出。转换后的字符串从最高的非零位开始输出。如果n为负数,则输出的字符串的第一个字符为’-’。b为大于1小于37的任意自然数。当b=2时,输出字符只可能是’0’和’1’;当b=16时,输出字符串中可能含有字符为’0’-‘9’,‘a’-‘f’(字母以小写输出)。b为18时,数码是’0’-‘9’,‘a’-‘h’,其中’a’代表10,'g’代表16, 'h’代表17。又比如,输入n=33,b=17,则输出33的17进制值为"1g"。
【输入形式】输入整数n和b,其中n可以为负数。n和b以空格分隔.
【输出形式】输出转换后的字符串s.
【样例输入】5 2
【样例输出】101
【样例说明】5的二进制就是101
这道题其实我之前写C++的时候写过,逻辑很简单,就是十进制转化为N进制,然后想一下平时是怎么转化的,就是先取余N,然后整除N,这样循环就可以了。但是这题我还是卡了十几分钟(我会说我是因为忘记了python的数字无法像C++一样直接转换为ascii字符然后debug半天吗?),代码如下
def itob(n, b, iterrable):
issmall_than_zero = False
if n<0:
n = -n
issmall_than_zero = True
while (n/b):
j = n%b
n = n//b
if j>9:
j=chr(j+97-10)
iterrable.append(j)
return issmall_than_zero
x = input().split(" ")
x[0] = int(x[0])
x[1] = int(x[1])
s = []
# x[1] = int(x[1])
ans = itob(x[0],x[1],s)
if ans:
print("-",end="")
for i in range(len(s)-1,-1,-1):
print(s[i],end="")
else:
for i in range(len(s)-1,-1,-1):
print(s[i],end="")
差不多就这么几道题目可以写一下吧,还是感觉python在刷题这一块还是C++用起来方便,而且建议自制力不好的人不要用python刷题,不然根本达不到训练算法的程度,只是全程在调用python给你封装好的语法糖罢了。(悄咪咪吐槽一句,杭电的程序设计课感觉好水啊