今天依旧是对算法题目的整理。话不多说,直接看题目。
一.
  问题描述
  第一行输入一个正整数 a,你需要计算从 0 时 0 分后经过 a 分钟得到的时间是多少。输出以 xx:xx 的形式表示,如果不足两位则左侧补 0。例如 a=36,则你要输出 00:36,a=61,则你要输出 01:01。
第二行输入两个正整数 c,d,你要输出 c/d 的结果,保留三位小数。

  输入格式
  第一行输入一个正整数 a(1≤a<1440)。
  第二行输入两个正整数 c,d(1≤c,d≤100)。

  输出格式
  输出两行。第一行输出 0 时 0 分后经过 a 分钟得到的时间是多少。输出以 xx:xx 的形式表示。第二行输出 c/d 的结果,保留三位小数。

  题目的意思很简单,就是先输入两个数,然后输出两个数,其中第一个数输入的是秒,而我们输出时要将其转化为时钟的形式,其核心就是我们怎么输出时钟形式,仅仅只是简单的运算肯定不行在第一位数字不足两位数时我们要在其前面加上 0 才可,对于我这样的小白来说第一反应是能不能手动加上前面的 0 ,先输入秒数,然后对其进行计算,分为前后两部分,分别对两部分进行判断,如果最后转化的数字不足两位数则我们在拼接字符串时就在前面加上 0 ,若转化后数字不止一位数则直接将其输出,所以得到我们第一部分的代码:

点击查看代码
a = int(input())
hours = a // 60   
minutes = a % 60   
if hours < 10:
    hour_str = '0' + str(hours)  
else:
    hour_str = str(hours)      
if minutes < 10:
    minute_str = '0' + str(minutes)  
else:
    minute_str = str(minutes)      
print(hour_str + ':' + minute_str)
  这样得到的答案并无问题,但如果我们需要转换的数字不止两个,几十、几百个呢?我们当然可以使用函数但,一次次的判断无疑拖慢了程序的运行速度,但我又不知道具体的语法,怎么办呢(挠头),当然是求助我们的csdn啦。经过查询,我们只需要在输出时设定输出数字是两位数即可(会自动补 0 ),于是我们第一部分的代码:
点击查看代码
a = int(input())
hours = a // 60
minutes = a % 60
print(f"{hours:02d}:{minutes:02d}")
  我们解决了第一个数的输出,接下来第二部分保留三位小数,同样我们在输出时设置即可:
点击查看代码
c, d = map(int, input().split())
print(f"{c / d:.3f}")
  将两端代码连接起来便是这一题的全部代码,我学习到的知识点就是输出时数字位数的设置。

二.
  问题描述
  给定一个数组,实现一个算法将数组中的所有 0 移动到末尾,但不可改变非 0 数字的相对位置。介绍如下:例如数组为 [0, 1, 0, 3, 12],将所有 0 移动到末尾的结果为 [1, 3, 12, 0, 0]。

  输入描述
  第一行输入一个数字 N (1<N<1000),为数组的长度。第二行输入数组的元素 Ai , 0<Ai<1000 。

  输出描述
  输出一行,为移动后数组。

  一看到题目里有数组这样的数据结构大脑突然空白了一下,重新审视一下题目,首先题目要求我们输入两行数,分别是数组的元素个数以及数组元素,我们需要把数组中的 0 移到数组最后,其他数字的位置不变,我的思路是首先我们建立一个数组1,然后我们对数组1中的元素进行判断,如果是 0 则删去并记录删去 0 的数量,最后建立一个新的数组2,我们将数组1中的元素填入数组2中并将记录下来的 0 的数量增加到数组2的末尾。于是解题代码如下:

点击查看代码
n = int(input()) 
arr = list(map(int, input().split())) 
fei0 = [x for x in arr if x != 0]
result = fei0 + [0] * (n - len(fei0))
print(' '.join(map(str, result)))
  成功提交代码后我又重新询问了一下 AI 的解决方法,它给出了不同的方法,其代码如下:
点击查看代码
n = int(input()) 
arr = list(map(int, input().split())) 
idx = 0 
for i in range(n):
    if arr[i] != 0:
        arr[idx] = arr[i]  
        idx += 1  # 目标位置后移
for i in range(idx, n):
    arr[i] = 0
print(' '.join(map(str, arr)))
  其解决思路的核心是利用了双指针。首先,通过遍历数组将所有非零元素按原始顺序移动到数组的前部,具体做法是使用一个指针idx记录下一个非零元素应该存放的位置,遍历数组时,每当遇到一个非零元素就将其放到idx位置,然后移动idx向后移位;遍历结束后,所有非零元素已集中在数组开头,这时从idx位置开始到数组末尾的全部位置再一次性填充为零,从而保持非零元素的相对顺序,同时将所有零都移动到了数组末尾。现在的我使用指针还是有点难度,需要多写一写熟悉熟悉。

三.
  问题描述
  小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整数。

  输入描述
  输入的第一行包含一个整数 n (1≤n≤10000),表示考试人数。接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

  输出描述
  输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

  简单来说我们需要输入的数字有两个分别为考试的人数以及他们的得分,通过程序我们计算得出及格率和优秀率,最后将其输出即可。我的思路很简单,将输入的数字先后与 85 和 60 进行比较,若该数字大于 85 则及格个数和优秀个数都加上 1 ,若不及 85 则再将其与 60 进行比较,最后将统计的及格个数和优秀个数两组数据除以总人数转化成百分率输出即可。于是我的代码如下:

点击查看代码
n = int(input())  
jige = 0    
youxiu = 0  
for _ in range(n):
    score = int(input())
    if score >= 85:  
        youxiu += 1
        jige += 1
    elif score >= 60: 
       jige += 1
jige = round(jige / n * 100)
youxiu = round(youxiu / n * 100)
print(f"{jige}%")
print(f"{youxiu}%")

  代码简单易懂,我很满意。
  好了,今天就先到这里了。 欲知后事如何,且听下回分解。