2024/12/13 【字符串】卡码网54.替换数字 知识点:数组填充类问题中,用到的从后向前操作的双指针法
和LeetCode不一样,需要完成函数的编写和测试函数的主函数体的编写,要自己输入输出。
注意的是输出不要有多余的提示内容,会报错。
def toNumber(s : str): s_list = list(s) n = len(s) for i in range(n): if s_list[i].isdigit(): s_list[i] = "number" return ''.join(s_list) if __name__ == "__main__": s = input() print(toNumber(s))
代码随想录给出了一个双指针的C++代码实现,提到针对这类题目的常见解法思路:
其实很多数组填充类的问题,其做法都是先预先给数组扩容带填充后的大小,然后在从后向前进行操作。
目前第一遍过只用了Python,C++的解法有时间学习:
#include <iostream> using namespace std; int main() { string s; while (cin >> s) { int sOldIndex = s.size() - 1; int count = 0; // 统计数字的个数 for (int i = 0; i < s.size(); i++) { if (s[i] >= '0' && s[i] <= '9') { count++; } } // 扩充字符串s的大小,也就是将每个数字替换成"number"之后的大小 s.resize(s.size() + count * 5); int sNewIndex = s.size() - 1; // 从后往前将数字替换为"number" while (sOldIndex >= 0) { if (s[sOldIndex] >= '0' && s[sOldIndex] <= '9') { s[sNewIndex--] = 'r'; s[sNewIndex--] = 'e'; s[sNewIndex--] = 'b'; s[sNewIndex--] = 'm'; s[sNewIndex--] = 'u'; s[sNewIndex--] = 'n'; } else { s[sNewIndex--] = s[sOldIndex]; } sOldIndex--; } cout << s << endl; } }
1.Python函数头里,形参的正确书写方式
报错详解:
-
错误代码:
def toNumber(string s):
- 这里
string s
的写法是错误的。 - Python 函数参数的定义格式是
参数名:类型
(类型标注是可选的),而不是像某些语言(如 C++ 或 Java)那样写成类型 参数名
。
- 这里
-
修正方法:
- 改为:
def toNumber(s: str):
s
是参数名,str
是类型标注(可省略)。- 也可以直接写:
def toNumber(s):
- 改为:
2.Python中空列表的正确添加元素方式:
s_list = list()
和 s_list[i] = str(s[i])
:
s_list
是一个空列表,不能直接通过索引i
给它赋值,因为列表初始时没有任何元素。这会导致IndexError
。- 正确的做法是通过
append
方法添加元素。
3.Python的Input函数
Python 的 input()
函数用于从用户输入获取数据。它会等待用户在终端输入内容,并返回输入的字符串。输入的内容始终是一个字符串,如果需要其他数据类型,需要进行转换。
基本语法:
input(prompt)
prompt
: 这是可选参数,用来给用户显示的提示信息。提示信息会在用户输入之前显示在终端上。- 返回值: 返回用户输入的内容(字符串)。
示例 1:简单使用
name = input("请输入您的名字: ") print(f"你好,{name}!")
- 程序会显示提示信息
"请输入您的名字: "
,然后等待用户输入。用户输入的内容会存储在name
变量中,最后打印出"你好,{name}!"
。
示例 2:将输入转换为整数
因为 input()
返回的总是字符串,如果你需要获取其他类型的数据(如整数、浮点数等),需要手动转换。
age = input("请输入您的年龄: ") age = int(age) # 将字符串转换为整数 print(f"您的年龄是 {age} 岁。")
- 用户输入的内容先被存储为字符串,然后通过
int()
函数将其转换为整数。
示例 3:一次读取多个输入
你可以使用 split()
方法将一个输入按空格分割,读取多个值。
x, y = input("请输入两个数字,用空格分隔: ").split() x = int(x) y = int(y) print(f"两个数字的和是: {x + y}")
input().split()
将输入的字符串按空格分割成多个部分,返回一个列表。在这个例子中,x
和y
分别接受了用户输入的两个数字,并将它们转换为整数,然后计算和。
示例 4:获取浮点数输入
如果需要获取浮点数类型的输入,可以使用 float()
函数进行转换。
weight = input("请输入您的体重 (kg): ") weight = float(weight) # 转换为浮点数 print(f"您的体重是 {weight} 公斤。")
示例 5:默认值和错误处理
你可以设置输入的默认值并处理用户的错误输入:
try: number = input("请输入一个数字: ") number = int(number) print(f"您输入的数字是: {number}") except ValueError: print("输入无效,请输入一个整数。")
- 如果用户输入的不是有效的整数,程序会捕获到
ValueError
异常,并给出提示。
4. python的主函数怎么写?
在 Python 中,主函数通常是一个用于组织代码的函数,通常被命名为 main()
,并且在程序的执行入口处调用。Python 的主函数并不像 C 或 C++ 中那样必需,但是为保持代码结构清晰,通常推荐定义一个主函数。
Python 中的主函数是通过 if __name__ == "__main__":
语句来控制程序入口的,这样可以确保主函数只在该脚本被直接运行时执行,而在该脚本被导入为模块时不执行。
示例
def main(): # 主程序代码 print("Hello, World!") if __name__ == "__main__": # 程序入口 main()
解析
def main()
:定义一个主函数main()
,通常用来包含你想要运行的代码。if __name__ == "__main__":
:这是一个标准的 Python 程序入口判断语句。只有当脚本被直接运行时,__name__
才会等于"__main__"
,此时main()
函数才会被调用。- 如果这个脚本被其他脚本导入,
__name__
会是该模块的名字,而不是"__main__"
,此时main()
不会被调用。
- 如果这个脚本被其他脚本导入,
为什么需要 if __name__ == "__main__":
?
- 模块化:你可以将代码组织成模块并在其他 Python 文件中导入,而无需执行主函数中的代码。例如:
import mymodule # 这时 main() 不会被执行,只会执行模块内的函数
- 可测试性:通过
if __name__ == "__main__":
,你可以在该模块被导入时避免执行不必要的代码,只在直接运行时才执行主逻辑。
5.Python中怎么把代码组织成模块?
在 Python 中,模块是一个包含函数、类和变量的文件,它为代码的组织和重用提供了强大的支持。将代码组织成模块的过程主要包括以下步骤:
(1). 创建一个模块
- 一个
.py
文件就是一个模块,文件名就是模块名。 - 在模块中,可以定义函数、类、变量,甚至包含其他模块的导入语句。
示例:创建一个模块 mymodule.py
# 文件名:mymodule.py # 定义一个函数 def greet(name): return f"Hello, {name}!" # 定义一个变量 PI = 3.14159 # 定义一个类 class Calculator: def add(self, a, b): return a + b def subtract(self, a, b): return a - b
(2). 导入模块
- 在另一个 Python 脚本中,可以通过
import
语句导入模块并使用其中的内容。
示例:导入 mymodule.py
# 文件名:main.py # 导入模块 import mymodule # 使用模块中的函数、变量和类 print(mymodule.greet("Alice")) # 输出:Hello, Alice! print(f"The value of PI is: {mymodule.PI}") # 输出:The value of PI is: 3.14159 calc = mymodule.Calculator() print(calc.add(5, 3)) # 输出:8 print(calc.subtract(5, 3)) # 输出:2
(3). 模块的多种导入方式
(1) 导入整个模块
import mymodule print(mymodule.greet("Alice"))
(2) 导入特定内容
from mymodule import greet, PI print(greet("Alice")) print(PI)
(3) 导入并重命名
import mymodule as mm print(mm.greet("Alice"))
(4) 导入所有内容 (不推荐,可能会导致命名冲突)
from mymodule import * print(greet("Alice")) print(PI)
(4). 将代码组织成包
- 包是一个包含多个模块的目录。目录下需要有一个特殊的
__init__.py
文件(可以是空文件,也可以包含初始化代码)。 - 结构示例:
myproject/ mypackage/ __init__.py module1.py module2.py main.py
使用包
# 导入包中的模块 from mypackage import module1, module2 # 或者 import mypackage.module1
(5). 模块的文件路径
- 模块所在路径:Python 默认会在当前目录、标准库路径以及
PYTHONPATH
环境变量中查找模块。 - 扩展模块路径:如果模块不在默认路径中,可以将路径添加到
sys.path
:
import sys sys.path.append('/path/to/your/module') import mymodule
(6). 创建可执行模块
可以在模块文件中定义一个 main
函数,并通过 if __name__ == "__main__":
来使模块既可以作为库使用,也可以直接运行。
示例:在 mymodule.py
中
def greet(name): return f"Hello, {name}!" if __name__ == "__main__": # 测试模块功能 print(greet("Test"))
在主程序中:
import mymodule print(mymodule.greet("Alice")) # 使用模块功能
运行 mymodule.py
时:
Hello, Test
通过以上方法,可以将代码模块化,不仅便于组织和管理,还能提升代码的可重用性和可维护性。