写在最前面的
实践的顺序,
应该是先将基础的 数据结构题目类型给实现。
然后再开始尝试 实现对应类型的算法题目,如回溯算法, 贪心算法, 动态规划, 图论;
-
基础的数据结构, 推荐卡尔的:
代码随想录:https://programmercarl.com/; -
算法部分,卡尔的内容结合: https://labuladong.online/algo/home/; 两者在原理解释上结合来看;
-
计算机基础知识,
操作系统、计算机网络、数据结构与算法、数据库、计算机组成原理, 基本
踏实的学习应该是在大学本科, 后续可以自学, 参考 阿秀的笔记
https://interviewguide.cn/notes/01-guide/web-guide-reading.html;
1. ACM 编程模式
在面试过程中,写代码时,
会出现ACM 的编程风格,即需要自己处理输入,输出,这里推荐参考:
-
牛客网的示例练习
-
卡尔网的 https://kamacoder.com/;
1.1 多行输入, 每行输入两个整数
import sys
# 循环执行每行输入, 每行读入后,依次执行如下操作
for line in sys.stdin:
cur_input = line.split() #
out = int(cur_input[0]) + int(cur_input[1]) # 将列表中每个元素转换成整型;
print(out)
-
首先我们从终端输入的每一行数据 被读入之后被视为字符类型,
-
每一行中,我们通过空格键来分隔各个数据, 在一行输入结束后,按下 enter 键, 读入之后被表示为换行符 \n ;
-
line.split 会对当前行中的数据处理, 通过split函数将他们分隔多个数据存储到列表中, 且此时列表中的每个元素仍是 str 类型; 在split()的过程中,如果不指定特殊字符, 则默认通过使用空格符 来分隔;
for line in sys.stdin:
从标准输入读取:for 循环 for line in sys.stdin: 从标准输入中逐行读取输入,直到到达文件结尾 (EOF)。当输入源(例如来自终端的文件或用户输入)关闭时,可能会发生这种情况。在典型的使用场景中(例如在管道中使用脚本或从文件重定向脚本时),这允许脚本无限期地处理输入或直到输入流关闭。
line.split()
处理每一行输入:在循环内,每次处理每一行输入。 line.split() 方法将字符串 line 拆分为列表 cur_input ,其中每个元素都是一个子字符串(最初在输入中用空格分隔)。例如,如果输入行是“123 456”,则 cur_input 将是 ['123', '456'] 。
int(cur_input[0]) + int(cur_input[1]) :此表达式将 cur_input 的第一个和第二个元素转换为整数并对它们求和。结果不会打印或存储在变量 out 之外,这意味着将使用每个新输入行重新计算结果,并且先前的结果将被覆盖。
注意,其中默认使用的分隔符有如下:
Space (' ') 空格 ( ' ' ):表示单词或字符之间的常规空格字符。
Tab ('\t'): 制表符 ( '\t' ):表示制表符,通常用于文本对齐。
Newline ('\n'):换行符 ( '\n' ):在 Unix/Linux 系统中表示一行的结束。它将光标移动到下一行。
Carriage Return ('\r'): 回车符 ( '\r' ):在较旧的 Mac 系统中单独使用,在 Windows 系统中与换行符 ( '\r\n' ) 结合使用,表示行的结束。它将光标返回到行的开头。
Form Feed ('\f'):换页 ( '\f' ):不太常用,该字符在打印机中推进进纸或在文本文档的某些上下文中更改到新“页面”。
当不带任何参数的情况下调用 split()
时,它会将任何上述这些空白字符的序列视为单个分隔符,并且还会在拆分之前自动删除字符串中的任何前导和尾随空白。此行为对于解析输入(其中元素之间的间距量可能不同或使用不同的行结束约定)特别有用。
2.2 输入多行, 需要指定行号
此循环还从标准输入中逐一读取每一行,但它使用 enumerate() 函数跟踪每行的索引(行号):
import sys
for i, line in enumerate(sys.stdin):
if i == 0:
n = int(line)
else:
a = line.split()
print(int(a[0]) + int(a[1]))
行为:与第一个循环类似,它迭代每一行直到 EOF,但 enumerate()
还提供了一个计数器 ( i
),默认从 0 开始,并随着每次迭代而递增。此 i
通常用作行号(从 0 开始,或者您可以通过向 enumerate()
提供开始参数来调整它)。
对于输入中行的位置相关的任务(例如,错误报告、必须被索引)。
2.3 输入多行,存在终止条件的
提供的代码片段使用了多个Python函数的组合( while
、 list
、 map
、 int
、 input
、 split
)来重复读取用户的输入,将输入拆分为多个部分,将这些部分转换为整数,并将它们存储在列表中。
while True:
try:
cur_list = list( map(int, input().split()) )
a, b = cur_list[0], cur_list[1]
if a == 0 and b == 0: break
print( a +b )
except:
break
以下是每个组件的详细说明以及它们如何协同工作.
while True:
目的:这是一个无限循环。它将无限期地继续执行其中的代码块,除非被break语句、错误或外部中断(如来自操作系统的终止信号)中断。
行为:它使循环无限运行,使脚本不断提示新输入并对其进行处理,直到明确停止。
input():
功能:该函数等待来自标准输入(通常是键盘)的用户输入。按下 Enter 键后, input() 将整行输入作为字符串读取。
.split()
功能:该方法将字符串拆分为一个列表,其中每个字符都是一个列表项。默认分隔符是任何空格,因此它根据空格、制表符等分隔输入。
map(int, input().split())
函数:map() 将函数应用于可迭代对象中的所有项目。这里, int 是应用的函数,因此 map(int, input().split()) 尝试将 input().split() 返回的列表中的每个项目从字符串转换为整数。
list(map(int, input().split()))
功能:由于 map() 返回一个map对象(它是一个迭代器),因此 list() 用于将这个迭代器转换为列表。为了在 Python 中轻松使用和访问整数作为列表结构,此步骤是必要的。
try, except 的组合
except: :这是一个捕获所有异常处理程序,这意味着它将拦截 try 块抛出的任何类型的异常。通常,最好指定异常类型(如 ValueError 、 IndexError 等),以避免捕获意外错误并掩盖错误。
break :如果 try 块中发生任何异常,则执行 except 块,打破循环并停止程序或退出循环。这可能是由于没有输入足够的数字(导致 IndexError )、输入非整数值(导致 ValueError )或其他不可预见的问题。
鲁棒性:通过防止程序因常见输入错误而崩溃,代码变得更加鲁棒。当遇到输入不足或非数字数据等问题时,它不会以错误消息终止,而是优雅地退出循环。
控制流:它们用于控制程序的流程,确保程序仅在正确的条件下继续运行,并在遇到可能导致运行时错误的问题时安全停止。
2.4 多行输入, 指定每行输入的个数
while True:
try:
cur_list = list( map(int, input().split()))
num0 = cur_list[0]
out = -cur_list[0]
if num0 == 0 : break
for i in range (len(cur_list)):
out += cur_list[i]
print(out)
except:
break