• Python 整数的N进制字符串表示,循环和函数_亲密数,DNA匹配A


    这次作业终于碰到需要思考的题目了(呜呜呜

    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给你封装好的语法糖罢了。(悄咪咪吐槽一句,杭电的程序设计课感觉好水啊

  • 相关阅读:
    scikit_learn 官方文档翻译(集成学习)
    机器学习之SVM与逻辑回归的联系和区别
    有序数组寻找中位数以及寻找K大元素
    有向图算法之拓扑排序
    机器学习之离散型特征处理--独热码(one_hot_encoding)
    计算广告学(2)--广告有效性模型
    机器学习实战--k-均值聚类
    SonarQube 扫描代码,SonarQube 进行代码质量检查
    Docker 搭建 Nexus3
    informix 安装 linux 客户端
  • 原文地址:https://www.cnblogs.com/yfc0818/p/11072621.html
Copyright © 2020-2023  润新知