• python(牛客)试题解析1 - 简单


    导航:

    一、NC103 反转字符串

    二、NC141 判断是否为回文字符串

    三、NC151 最大公约数

    四、NC65 斐波那契数列

    五、字符按排序后查看第k个最小的字母

    六、数组内取出下标相同的元素求和从小到大排序,并取第k小的和值

    七、将探险队的坐标位置中挑选出相对总部的距离最远的坐标位置

    - - - - - - - - - - 分-割-线 - - - - - - - - - - -

    一、NC103 反转字符串
    描述:写出一个程序,接受一个字符串,然后输出该字符串反转后的字符串。(字符串长度不超过1000)
    示例:输入:"abcd",输出返回值:"dcba"

    解析1:转出字符串中的元素组成列表,并反转列表,再次输出为字符串

    复制代码
    class Solution:
        def solve(self , str: str) -> str:
            # write code here
            list1 = []
            for i in str:
                list1.append(i)
            list1.reverse()
            s =""
            for i in list1:
                s = s+i
            return s
    复制代码

    解析2:利用字符串的切片倒序输出

    class Solution:
        def solve(self , str: str) -> str:
            str1 = str[::-1]
            return str1

     

    二、NC141 判断是否为回文字符串

    描述:给定一个长度为 n 的字符串,请编写一个函数判断该字符串是否回文。如果是回文请返回true,否则返回false。字符串回文指该字符串正序与其逆序逐字符一致。

    示例:输入:"absba",返回值:true;输入:"ranko",返回值:false

    解析1:反转字符串,并增加判断

     

    复制代码
    class Solution:
        def judge(self , str: str) -> bool:
            str1 = str[::-1]
            if str1 == str:
                return True
            else:
                return False
    复制代码

     解析2:使用三母表达式简化输出

    class Solution:
        def judge(self , str: str) -> bool:
            return True if str[::-1]==str[:] else False

     

    三、NC151 最大公约数

    描述:如果有一个自然数 a 能被自然数 b 整除,则称 a 为 b 的倍数, b 为 a 的约数。几个自然数公有的约数,叫做这几个自然数的公约数。公约数中最大的一个公约数,称为这几个自然数的最大公约数。输入 a 和 b , 请返回 a 和 b 的最大公约数。

    示例:输入3,6,返回3;输入8,12,返回4

    解析1:通过因式分解取出每个数字的质因数,然后遍历找到两组质因数里面相同的质因数,最后通过相乘得到最大公约数

    复制代码
    class Solution:
        def gcd(self , a: int, b: int) -> int:
            #a = 30
            #b = 40
            res1 = []
            res2 = []
            res3 = []
            # 因式分解
            while a > 1:
                for i in range(a - 1):
                    k = i + 2
                    if a % k == 0:
                        res1.append(k)
                        a = int(a / k)
                        break
            #print(res1)
            while b > 1:
                for i in range(2, b + 1):
                    if b % i == 0:
                        res2.append(i)
                        b = int(b / i)
                        break
            #print(res2)
            for i in range(0, len(res1)):
                if res1[i] in res2:
                    res3.append(res1[i])
                    res2.remove(res1[i])
            res = 1
            for i in res3:
                res = res * i
            #print(res)
            return res
    复制代码

    解析2:辗转相减法,运算起来很简洁:出自《九章算术》的一种求最大公约数的算法,它原本是为约分而设计的,但它适用于任何需要求最大公约数的场合,以较大的数减较小的数,接着把所得的差与较小的数比较,并以大数减小数。继续这个操作,直到所得的减数和差相等为止。则第一步中约掉的若干个2的积与第二步中等数的乘积就是所求的最大公约数

    复制代码
    class Solution:
        def gcd(self , a: int, b: int) -> int:
            t=0
            m=0
            n=0
            # 辗转相减减法
            if a == b:
                t = a
            else:
                m = max(a, b)
                n = min(a, b)
                t = m - n
                while n != t:
                    m, n = max(n, t), min(n, t)
                    t = m - n
            return t
    复制代码

     

    四、NC65 斐波那契数列

    描述:要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项,且第一个和第二个数字均为1

    示例:输入4,根据斐波那契数列的定义可知,fib(1)=1,fib(2)=1,fib(3)=fib(3-1)+fib(3-2)=2,fib(4)=fib(4-1)+fib(4-2)=3,所以答案为3。

    解析1:使用递归的方式,但是由于算法复杂度较高,当数据较大的,运行的时间较长

    复制代码
    class Solution:
        def Fibonacci(self , n: int) -> int:
            if n == 1 or n == 2:
                return 1
            elif n == 3:
                return 2
            else:
                return self.Fibonacci(n-1) + self.Fibonacci(n-2)
    复制代码

    解析2:使用for循环的方式,利用记录中间变量temp避免了重复计算

    复制代码
    class Solution:
        def Fibonacci(self , n: int) -> int:
            a, b = 1, 1
            if n <= 1:
                return 1
            else:
                for i in range(2, n):
                    tmp = a + b
                    a = b
                    b = tmp
                return b
    复制代码

     

    五、输入一个由n个大小写字母组成的字符,按Ascii码值从小到大排序,查找字符串中第k个最小Ascii码值的字母

    输入要求:
    第一行输入大小写组成的字符串
    第二行输入k, k必须大于0,k可以大于字符串长度
    输出要求:
    输出该字母所在字符串的位置索引,字符串第一个位置索引是为0,
    k如果大于字符串长度,则输出最大值的怎么所在字符串的位置索引,
    如果第k个最小Ascii码值的字母有重复,则输出该字母的最小位置索引。
    示例:
    输入:
    AbCdeFG
    3
    输出:
    5

    解析:字符串排序默认即使用Ascii码,所以直接使用sorted方法处理

    复制代码
    l1 = input()
    k = int(input())
    if k > len(l1):
        k = len(l1)
    l2 =sorted(l1)
    letter = l2[k-1]
    print(l1.index(letter))
    复制代码

     

    六、数组内取出下标相同的元素求和从小到大排序,并取第k小的和值

    给定两个整数数组,arr1、arr2,数组元素按升序排列;
    假设从arr1、arr2中分别取出一个元素,可构成一对元素;
    现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值;
    注意:两对元素对应arr1、arr2的下标是相同的,视为同一对元素。
    描述:
    输入两行数组arr1、arr2
    每行首个数字为数组大小size, 0 < size <= 100
    arr1,arr2中的每个元素e, 0< e <1000
    接下来一行,正整数k 0 < k <= arr1.size * arr2.size
    输出描述
    满足要求的最小值
    示例:
    输入
    3 1 1 2
    3 1 2 3
    2
    输出
    4
    解析:推导式进行求和后从小到大排序,并取得第k小的和值
    复制代码
    a = list(map(int,input().split()))[1:]
    b = list(map(int,input().split()))[1:]
    k = int(input())
    sum_ = [x+y for x in a for y in b]
    sum2 = sorted(sum_)
    print(sum(sum2[:k]))
    复制代码

     

    七、将探险队的坐标位置中挑选出相对总部的距离最远的坐标位置

    描述:给出一个仅包含字母的字符串,不包含空格,统计字符串中各个字母(区分大小写)出现的次数,并按照字母出现次数从大到小的顺序输出各个字母及其出现次数。如果次数相同,按照自然顺序进行排序,且小写字母在大写字母之前。
    输入描述:
    输入一行,为一个仅包含字母的字符串。
    输出描述:
    按照字母出现次数从大到小的顺序输出各个字母和字母次数,用英文分号分隔,注意末尾的分号;字母和次数间用英文冒号分隔。
    示例1
    输入
    xyxyXX
    输出
    x:2;y:2;X:2;
    说明
    每个字符出现的个数都是2,故x排在y之前,而小写字母x在X之前
    示例2
    输入
    abababb
    输出
    b:4;a:3;

    描述:通过字典记录字符出现的次数,并进行排序输出

    复制代码
    s = input()
    d = {}
    a = []
    for i in s:
        if i in d.keys():
            d[i] += 1
        else:
            d[i] = 1
    l = sorted(d.items(),key=lambda x:x[1],reverse=True)
    for i in l:
        a.append(f"{i[0]}:{i[1]}")
    print(";".join(a)+";")
    复制代码

     

  • 相关阅读:
    视频转格式用什么工具?mp4格式转换器,好用的视频格式转换器
    一文讲清 c++ 之队列
    k8s+springcloud+nacos部署配置
    分割回文串
    makkefile文件自动化编译以及基础文件命令(补)
    深度优先搜索实现抓牛问题
    数据分析技能点-机器学习优化思想
    一场由星巴克开启的 Web3新场景探索
    2530. 执行 K 次操作后的最大分数
    自动驾驶入门:规划
  • 原文地址:https://www.cnblogs.com/mrwhite2020/p/16905635.html