一些编程题集合

前情提要:

在不同的答题系统测试代码时,要格外注意提供的输入是什么格式,可以先打印一下type()和内容,再编写函数。还要注意题目要求的输出的格式,这里只需要了解一点‘print打印变量的规则’‘格式化字符串’的知识点即可。

1、有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

知识点:约瑟夫问题。注意这里的初始编号是1,而传统的约瑟夫问题初始编号是0。

代码:

import sys

# 主代码
def josephus(n):
    if n==1:  # 当只有1个人时
        return 1

    circle=list(range(1,n+1))   # 当大于1个人时,初始化圈子
    index=0                 # 当前报数的人在圈子中的索引

    while len(circle)>1:     # 同上,当圈子中超过1个人时
        index=(index+2)%len(circle)    # 报到3的人的索引
        circle.pop(index)       # 将报到的人移除圈子
    
    return circle[0]


# 测试
if __name__ == "__main__":
    for line in sys.stdin:
        a = line.split()
        input=int(a[0])
        output=josephus(input)
        print(output)
2、小陆每天要写一份工作日报,日报标题含有日期。几年后,他翻开以前的日报,想知道两份日报的日期是否同为星期几,请编程帮助他判断。

知识点:datetime库、列表元素的读取

代码:

import sys
from datetime import datetime

# main-code
def wheather_same_time(input):  # input : e.g.['1970', '1', '2', '2020', '2', '7']
    lst=list(map(int,input))
    d1,d2=lst[:3],lst[3:]
    w1 = datetime(d1[0],d1[1],d1[2]).isoweekday()
    w2 = datetime(d2[0],d2[1],d2[2]).isoweekday()
    if w1==w2:
        return True
    else:
        return False

   
# test

for line in sys.stdin:
    if len(line)>2:   # 不对输入的行数进行判断,只对行数后面的日期的输入进行判断
        input=line.split()
        print(wheather_same_time(input))
        
        


3、段誉身具凌波微波,动无常则,若危若安,一次能走一级台阶或者两级台阶,他要爬一段30级的山路,问有多少种走法?分析如何计算,然后编程解答。进阶问题:当他轻功熟练度提升,一次最多可以走三级,那就结果有什么变化?后来走火入魔了,不能走一级,只能走二或三级,又有什么变化?

知识点:动态规划、斐波那契数列

代码:

import sys


def climbStairs_1or2(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    else:
        lst=[0]*(n+1)
        lst[1]=1
        lst[2]=2
        for i in range(3,n+1):
            lst[i]=lst[i-1]+lst[i-2]
        return lst[n]

def climbStairs_1or2or3(n):
    if n==1:
        return 1
    elif n==2:
        return 2
    elif n==3:
        return 4
    else:
        lst=[0]*(n+1)
        lst[1],lst[2],lst[3]=1,2,4
        for i in range(4,n+1):
            lst[i]=lst[i-1]+lst[i-1]+lst[i-3]
        return lst[n]

def climbStairs_2or3(n):
    if n==1:
        return 0
    elif n==2:
        return 1
    elif n==3:
        return 1
    else:
        lst=[0]*(n+1)
        lst[1],lst[2],lst[3]=0,1,1
        for i in range(n+1):
            lst[i]=lst[i-2]+lst[i-3]
        return lst[n]


for line in sys.stdin:
    a = line.split()
    a=int(a[0])
    print(f'{climbStairs_1or2(a)} {climbStairs_1or2or3(a)} {climbStairs_2or3(a)}')
4、小球自由落体

一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第n次落地时,共经过多少米?第n次反弹多高?

数据范围: 1≤n≤100 

知识点:找规律。

代码:

import sys
 
# 主代码
def free_fall(n):
    if n==1:
        hight=50
        L=100
        return L,hight
     
    hight=50
    L=100
    for i in range(2,n+1):
        hight *= 0.5
        L+=hight*4
    return L,hight
 
 
# 从标准输入读取参数进行测试
if __name__ == "__main__":      
    for line in sys.stdin:
        # 从输入行获取参数
        inputs=line.split()
        # 将列表的第一个元素转换成整数
        n=int(inputs[0])
        # 计算
        res_L,res_h=free_fall(n)
        print(f'{res_L:.6f} {res_h:.6f}')
5、生成n行杨辉三角

知识点:

代码:

class Solution(object):
    def generate(self, numRows):
        if numRows==1:
            return [[1]]
        elif numRows==2:
            return [[1],[1,1]]
        else:
            lst=[[1],[1,1]]  # 初始化
            for i in range(2,numRows):   # 从第三行开始遍历出每一行的列表
                sub1=lst[-1]  # 上一行
                sub2=[0]*(i+1)       # 当前行
                for j in range(i+1):    # 遍历索引,算出当前行的所有元素
                    if j==0 or j ==i:
                        sub2[0]=sub2[i]=1
                    else:
                        sub2[j]=sub1[j]+sub1[j-1]
                lst.append(sub2)
        return lst

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值