从零开始的Python(1)

这里假设读者已经掌握Python基本语法。

反向输出一个三位数

描述

将一个三位数反向输出。

输入

一个三位数 $n$。

1
100

输出

反向输出 $n$。

1
001

Solution

Python中,通常可以使用-1进行字符串翻转。

1
2
3
s = input()
reverse_s = s[::-1]
print(reverse_s)

字符串中的整数求和

描述

输入两个长度为3的字符串,每个串前两个字符是数字,后一个字符是字母,求这两个串中的整数的和。

输入

一行,两个字符串。

1
12B 34D

输出

两个字符串中整数的和。

1
46

Solution

首先,需要用split从输入中提取以空格分段的列表,列表元素为字符串格式。

然后,取出这两个字符串中的整数部分并相加即可。

1
2
3
4
lst = input().split()
x = int(lst[0][0] + lst[0][1])
y = int(lst[1][0] + lst[1][1])
print(x + y)

点与正方形的关系

描述

有一个正方形,四个角的坐标(x,y)分别是(1,-1),(1,1),(-1,-1),(-1,1),x是横轴,y是纵轴。

写一个程序,判断一个给定的点是否在这个正方形内(包括正方形边界)。

输入

输入一行,包括两个整数 $x,y$ ,以一个空格分开,表示坐标 $(x,y)$。

1
1 1

输出

输出一行,如果点在正方形内,则输出yes,否则输出no。

1
yes

Solution

上面已经说过输入的规则了,因此接下来只需要提取相应坐标并用条件判断语句判断即可。

1
2
3
4
5
6
7
lst = input().split()
x = int(lst[0])
y = int(lst[1])
if -1 <= x <= 1 and -1 <= y <= 1:
    print("yes")
else:
    print("no")

简单计算器

描述

一个最简单的计算器,支持+, -, *, / 四种运算。仅需考虑输入输出为整数的情况(除法结果就是商,忽略余数)。

输入

输入只有一行,共有三个参数,其中第1、2个参数为整数,第3个参数为操作符(+,-,*,/)。

1
1 2 +

输出

输出只有一行,一个整数,为运算结果。然而:

  1. 如果出现除数为0的情况,则输出:Divided by zero!

  2. 如果出现无效的操作符(即不为 +, -, *, / 之一),则输出:Invalid operator!

1
3

Solution

仍然使用条件判断语句模拟即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
lst = input().split()
x = int(lst[0])
y = int(lst[1])
z = lst[2]
if z == "+":
    print(x + y)
elif z == '-':
    print(x - y)
elif z == '*':
    print(x * y)
elif z == '/' and y != 0:
    print(x // y)
elif z == '/' and y == 0:
    print("Divided by zero!")
else:
    print("Invalid operator!")

围栏

描述

小A打算新建一幢楼,这幢楼需要占用一块长方形的面积恰好为 $n$ 平方米的土地,且为了方便测量,这块土地的长宽必须为整数米。

小A需要在这幢楼外边修围栏,围栏长度为这块长方形的周长。

现在小A想要知道最小的围栏长度。

输入

第一行一个正整数 $n(n \leq 2 \times 10^9)$ ,表示楼的面积。

1
2

输出

一行一个数表示答案。数据保证答案在int范围内。

1
6

Solution

数据范围告诉我们,这题直接枚举长方形的短边即可,即 $1 \sim \sqrt{n}$ ,因此需要导入math库计算根号。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import math

s = int(input())
mi = float("inf")
for i in range(1, int(math.sqrt(s)) + 1):
    if s % i == 0:
        l = s // i
        c = 2 * (l + i)
        mi = min(c, mi)
print(mi)

解密

描述

有一种简单的加密算法,对于一个长度为n的字符串,这个算法将会以第(n+1)/2(向下取整)个字符为中间轴(最左边的字符算第1个字符),将该字符写在密文的开头,然后对左半部分按照同样的办法进行加密并写下密文,再对右半部分按照同样的办法进行加密并写下密文。以此类推,直到左右部分为空,即完成加密。

例如,如果要对12345678进行加密,第一步将选择4作为中间轴,将其写在密文开头,然后继续对左右两边(123和5678)分别继续按这个算法处理并写下,我们可以将其记作4[123][5678]([]代表待加密处理的部分)。

对于左半部分123,中间轴是2,左半部分为1,右半部分为3因此加密结果为213(1的中间轴为1,左右均为空,因此结果为1,而3同理)。

对于右半部分5678,中间轴是6,左半部分为5,右半部分为78,因此加密结果为65[78] → 6578(78的中间轴为7,左半部分为空,右半部分为8,因此得到78)。

简单来说,整个加密过程如下:

12345678 → 4[123][5678] → 42[1][3][5678]→ 4213[5678] → 42136[5][78] → 42136578

因此,对12345678的加密结果为42136578。

现在给出一个长度为 $n(1 \leq n \leq 50000)$ 的由数字构成的字符串,这个字符串是加密后的密文,请你还原出加密前的明文。

输入

一行,一个长度为 $n(1 \leq n \leq 50000)$ 的由数字构成的字符串字符串,代表加密后的密文。

1
123456789

输出

一行,一个长度同样为 $n$ 的字符串,代表解密后的明文。

1
324517689

提示

324517689 → 1[3245][7689] → 12[3][45][7689] → 12345[7689] → 123456[7][89] → 123456789

Solution

首先,根据计概的经验,这道题应该使用递归再二分来做,有点像之后数据结构会学到的二叉树的先序遍历。

然而,在Python里面我们还不会递归(笔者注:当时老师还没讲函数相关内容)。

查资料后发现,在Python的函数中,传入的列表是可变对象,而其他不是,即函数中可变对象是可变的,而不可变对象只传值,可以类比到C++的引用和传值。

以及,Python函数的书写格式,在这题中也体现出来了,它不需要指定变量类型(虽然指定也可以)。

而最后的join函数,则代表用' ',即空格,将res中的元素连接起来,形成一个完整的字符串。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
def operate(s):
    n = len(s)
    res = [''] * n
    index = [0]  #采用列表,这样作为可变对象可以传递到外部

    def lower_bound(l, r):
        if l > r:
            return
        mid = (l + r) // 2
        res[mid] = s[index[0]]
        index[0] += 1
        lower_bound(l, mid - 1)
        lower_bound(mid + 1, r)

    lower_bound(0, n - 1)
    return ''.join(res)


u = input()
print(operate(u))
本博客已稳定运行
发表了43篇文章 · 总计290.94k字
使用 Hugo 构建
主题 StackJimmy 设计