牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧

目录

一、笔试技巧

二、单行、多行输入

三 、代码调试技巧


一、笔试技巧

提高通过率大原则:
1.本地IDE调代码的速度更快

2.修改已>0%的代码比新做一道题更快

3.一定要看清题意!!!

 

提高通过率的技巧:
1.时间复杂度问题:增加条件break或continue出循环,能break尽量break;

                                减少不必要的判断条件(比如在不在字典中);

                                做一些排序来减少后期的工作量

2.空间复杂度问题:

3.边界条件:某些数据是不是始终存在

测试用例通过但0%的原因:
1.没有理解题意

 

 

输入
第一行说明nmp这种数据量,最后一个参数一般为第二行开始有几行,且是字符型的数据输入,可以按下面的方法进行输入处理。

第一行:

a,b,c=[int(i) for i in input(0.solit()]

第二行:

info=[]

for i in range(c):

    info.append([int(i) for i in input().split()])

不用input()的话也可以用sys.stdin.readline().strip()

 

 

 

输出
一般逐行打印

for i in result:

    print(i)

 

常用数据结构
list和dict比较好用,不能导入numpy库

list:做整体的排序

dict:做局部的排序,要在单个条件下xxx

 
常用函数
list
min() max() sum() .index()

.remove(具体内容)  .pop(索引号)    del a[索引号]

.sort(key=lambda x: x[0])

.sort(key=lambda x:(-x[1],x[0],x[2]))#默认是升序,加个符号变降序,可做多级排序。

sorted()#不在本地做排序

元素 in list名称

变量
float('inf')无穷大 

字典
.keys()

.values()

.items()#返回的是元组

 

字符串
.strip() 去除首位空格

.strip().strip(‘-a’)去除首位空格和字符

S[:3]+S[5:] 拼接字符串,去除某个字符

.replace(‘a’,’b’) 替换字符

re.sub(‘a’,’b’,s) 替换字符

 

浮点数输入:

        a = eval(input())
        # eval()对输入的字符转换对算式并计算


二、单行、多行输入

python的读取方法包括如下方法readline、readlines和read。

python


import sys
try:
    while True:
        line = sys.stdin.readline().strip()
        if line == '':
            break
        lines = line.split()
        print int(lines[0]) + int(lines[1])
except:
    pass

python3

import sys 
for line in sys.stdin:
    a = line.split()
    print(int(a[0]) + int(a[1]))

 

代码多行读取

牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧_第1张图片

 

import sys
lines = []
while True:
    line = sys.stdin.readline().strip()
    if line == "":
        break
    lines.append(line)
print(lines)

牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧_第2张图片

 

牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧_第3张图片

2. 单行输入:注意要通过强制转换,将字符串转为数字

import sys
line = sys.stdin.readline().strip()
print(line)

3.

Python中的Input()函数在输入时,遇到回车符,那么一次输入就结束了。这不能满足输入多行文本并且行数也不确定的情形,当然输入空行也是允许的。

方法1:利用异常处理机制实现

lines=[]
while True:
    try:
        lines.append(input())
    except:
        break
 
print(lines)
实际运行时,可以输入多行,当输入最后一行并回车后,按组合键ctrl+D,表示EOF,即End of File、文件尾的意思。此时,input()函数会遇到EOF的异常。Python的异常处理机制将捕获到此异常,执行except部分的语句,此语句为break,因此,立即跳出while循环。这正好满足了我们的需要。
例如,输入:
12 345 3.14159回车
I am a student.回车
Hello, world!回车
在集成开发环境中运行时,请按ctrl+D组合键结束多行输入。如果在Windows命令行下用"python 源代码文件名.py”方式运行时,请按ctrl+Z组合键结束多行输入。

输出结果如下:
['12 345 3.14159', 'I am a student.', 'Hello, world!']

方法二:利用标准输入文件对象sys.stdin的readlines()函数实现
因为键盘是标准输入设备,计算机操作系统将键盘也是当做文件来对待的,其实计算机操作系统将包括键盘显示器鼠标打印机等在内的各种外围设备都当做文件来对待。Python中与键盘对应的文件对象是sys.stdin,因此可以利用sys.stdin.readlines()函数来实现读取多行文本,一直到遇到文件尾即EOF为止。

import sys
lines=sys.stdin.readlines()
print(lines)
输入同上,

输出如下:

['12 345 3.14159\n', 'I am a student.\n', 'Hello, world!\n']

可以看出,这种方式2与方式1的输出结果有细微差别,每行末尾有'\n'字符(即回车符)。
————————————————

===============================================================================================

转自:https://www.cnblogs.com/BigFishFly/p/6622784.html

python之sys.stdout、sys.stdin

转自:http://www.cnblogs.com/turtle-fly/p/3280519.html

本文环境:Python 2.7 
使用 print obj 而非 print(obj)
 

sys.stdin,sys.stdout,sys.stderr: stdin , stdout , 以及stderr 变量包含与标准I/O 流对应的流对象. 如果需要更好地控制输出,而print 不能满足你的要求, 它们就是你所需要的. 你也可以替换它们, 这时候你就可以重定向(script.py < file.txt>)输出和输入到其它设备( device ), 或者以非标准的方式处理它们

 

1.1 sys.stdout 与 print

当我们在 Python 中打印对象调用 print obj 时候,事实上是调用了 sys.stdout.write(obj+'\n')
print 将你需要的内容打印到了控制台,然后追加了一个换行符
print 会调用 sys.stdout 的 write 方法
以下两行在事实上等价:
sys.stdout.write('hello'+'\n') 
print 'hello'

1.2sys.stdin 与 raw_input

当我们用 raw_input('Input promption: ') 时,事实上是先把提示信息输出,然后捕获输入
以下两组在事实上等价:
hi=raw_input('hello? ') 
print 'hello? ', #comma to stay in the same line 
hi=sys.stdin.readline()[:-1] # -1 to discard the '\n' in input stream

1.3从控制台重定向到文件

原始的 sys.stdout 指向控制台
如果把文件的对象的引用赋给 sys.stdout,那么 print 调用的就是文件对象的 write 方法
f_handler=open('out.log', 'w') 
sys.stdout=f_handler 
print 'hello'
# this hello can't be viewed on concole 
# this hello is in file out.log
记住,如果你还想在控制台打印一些东西的话,最好先将原始的控制台对象引用保存下来,向文件中打印之后再恢复 sys.stdout

__console__=sys.stdout 
# redirection start # 
... 
# redirection end 
sys.stdout=__console__
 

1.4同时重定向到控制台和文件

如果我们希望打印的内容一方面输出到控制台,另一方面输出到文件作为日志保存,那么该怎么办?
将打印的内容保留在内存中,而不是一打印就将 buffer 释放刷新,那么放到一个字符串区域中会怎样?
a='' 
sys.stdout=a 
print 'hello'
OK,上述代码是无法正常运行的
Traceback (most recent call last): File 
".\hello.py", line xx, in print 'hello' 
AttributeError: 'str' 
object has no attribute 'write'
错误很明显,就是上面强调过的,在尝试调用 sys.stdout.write() 的时候,发现没有 write 方法
另外,这里之所以提示 attribute error 而不是找不到函数等等,我猜想是因为python 将对象/类的函数指针记录作为对象/类的一个属性来对待,只是保留了函数的入口地址
既然这样,那么我们必须给重定向到的对象实现一个 write 方法:

复制代码

复制代码

import sys

class __redirection__:
    
    def __init__(self):
        self.buff=''
        self.__console__=sys.stdout
        
    def write(self, output_stream):
        self.buff+=output_stream
        
    def to_console(self):
        sys.stdout=self.__console__
        print self.buff
    
    def to_file(self, file_path):
        f=open(file_path,'w')
        sys.stdout=f
        print self.buff
        f.close()
    
    def flush(self):
        self.buff=''
        
    def reset(self):
        sys.stdout=self.__console__
        

if __name__=="__main__":
    # redirection
    r_obj=__redirection__()
    sys.stdout=r_obj
    
    # get output stream
    print 'hello'
    print 'there'
    
    # redirect to console
    r_obj.to_console()
    
    # redirect to file
    r_obj.to_file('out.log')
    
    # flush buffer
    r_obj.flush()
    
    # reset
    r_obj.reset()

复制代码

复制代码

同样的,sys.stderr, sys.stdin 也都可以被重定向到多个地址

 

三 、代码调试技巧

deals = [lambda x, y: (x + 1, y),  # 向下
         lambda x, y: (x, y + 1),  # 向右
         lambda x, y: (x - 1, y),  # 向上
         lambda x, y: (x, y - 1),  # 向左
         ]
def deal_maze(start, end, maze):
    path = []  # 走过的路径
    path.append(start)
    maze[0][0] = 2  # 走过的路径记为2
    while len(path) > 0:
        curnode = path[-1]
        if curnode[0] == end[0] and curnode[1] == end[1]:
            print('到达终点')
            for i in path:
                print(i)
            return True
        for deal in deals:
            nextnode = deal(curnode[0], curnode[1])
            if 0 <= nextnode[0] <= end[0] and 0 <= nextnode[1] <= end[1]:
                # 判断没有出迷宫
                if maze[nextnode[0]][nextnode[1]] == 0:
                    path.append(nextnode)
                    maze[nextnode[0]][nextnode[1]] = 2
                    break
        else:
            path.pop()
    else:
        print('没有路')
        return False


while True:
    [a, b] = list(map(int, input().split()))  # a为行,b为列
    maze = []  # 迷宫本身
    for i in range(a):
        maze.append([int(j) for j in input().split()])

    deal_maze((0, 0), (a - 1, b - 1), maze)

输出:
5 5
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
到达终点
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

 

开始调试:

点击按钮1,然后点击按钮2”自测“。(注意,不是点击按钮3)

牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧_第4张图片

弹出如下图:

先后在1和2处填写测试用例的输入和输出,然后点击”自测调试”,测试完毕,点击按钮3

自测调试输出如下:

自测结果

不通过

如果使用c/c++要保证int main函数最终 return 0;如果使用其余语言请检查代码\"是否有数组越界等异常\"或者\"是否有语法错误\"点击对比用例标准输出与你的输出
(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

你的输出为:(0, 0)
(1, 0)
(2, 0)
(2, 1)
(2, 2)
(2, 3)
(2, 4)
(3, 4)
(4, 4)

 然后点击“点击对比用例标准输出与你的输出”,弹出标号4,进行对比即可

牛客网Python笔试技巧、单行多行输入方法以及代码调试技巧_第5张图片

修改:

            for i in path:
                #print(i)
                print("(%d,%d)" % (i[0], i[1]))

注意:上面的代码,在本地运行OK,但是在牛客网上会失败。

需要添加try:

            except:

              

while True:
    try: 
        [a,b]=list(map(int,input().split())) #a为行,b为列
        maze=[] #迷宫本身
        for i in range(a):
            maze.append([int(j) for j in input().split()])
        deal_maze((0,0),(a-1,b-1),maze)
    except:
        break

 

你可能感兴趣的:(基础算法和数据结构)