Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和
2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys.stdin以前还真是没有碰到过,以前用的都是input,不得不感慨一句,永远不要觉得自己学的多牛x,还是有很多东西都是自己根本不知道的,或者根本就没有意识到自己不知道,好了下面回到正题!
下面的讲解参考文章链接:
https://blog.csdn.net/CAU_Ayao/article/details/81985103【只结合了sys.stdin和input进行讲解,给出的例子也比较全面】
https://www.cnblogs.com/keye/p/7859181.html【不仅对sys.stdin和input进行讲解,对sys.stdout和print也进行了对比讲解】
下面根据参考文章写得自己的理解
一、sys.stdout与Print
原始的sys.stdout指向控制台,如果把文件的对象引用赋给sys.stdout,那么print调用的就是文件对象的write方法。即在调用print方法的时候,事实上调用了sys.stdout.write(obj+'\n')
print 将需要的内容打印到控制台,然后追加一个换行符
以下两行代码等价:
sys.stdout.write('hello' + '\n')
print('hello')
二、sys.stdin与input
1、sys.stdin是一个标准化的输入方法,以sys.stdin.readline()为例讲解,下面先来看看一个小例子。
import sys
print('Plase input your name: ')
name = sys.stdin.readline()
print('Hello ', name)
输出结果:
Plase input your name:
marry
Hello marry
2、python3中使用sys.stdin.readline()可以实现标准输入,其中默认输入的格式是字符串,如果是int,float类型则需要强制转换。
import sys
try:
while True:
print('Please input a number1:')
n1 = sys.stdin.readline().strip('\n') # 去掉输入行最后的\n,
print('Please input a number2:')
n2 = sys.stdin.readline() # 对比上面的输入结果,说明最后读取的数据最后将\n一起读取,最后是“字符串+\n”的形式
print('Please input some numbers:')
sn = sys.stdin.readline().strip() # 若是多输入,strip()默认是以空格分隔
print(sn) # 直接输出结果,说明读取的数据将最后的空格给去掉了,这里输入的时候在结尾的位置特意多加了一个空格
if sn == '':
break
sn = list(map(int, sn.split())) # 如果要强制转换成int等类型,可以调用map()函数。
print(n2+n1) # 44 55\n 77 88
print(n1+n2) # 77 8844 55 \n 用于演示说明strip可以实现将最后输入的指定字符去掉 print(sn)
except:
pass
输出结果:
Please input a number1:
77 88
Please input a number2:
44 55
Please input some numbers:
78 45 12 # 备注:这里输入的时候在最后是特意加了一个空格的,下一行是输出结果,可以看到,空格是没有读取到的,读取的内容是去掉空格之后的字符。
78 45 12
44 55
77 88#备注:这里是为了验证加了strip和不加strip的区别,strip可以实现将最后输入的指定字符去掉,不读取。
77 8844 55 [78, 45, 12]
3、python3中sys.stdin与input的区别
(1)input()括号内可以直接填写说明文字,sys.stdin还需要加个print方法给出提示信息。
import sys
name1 = input('请输入姓名1:')
print('请输入姓名2:')
name2 = sys.stdin.readline()
print(name1)
print(name2)
输出结果:
请输入姓名1:mike
请输入姓名2:
tom
mike
tom
(2)sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',因此用len计算长度时是把换行符'\n'算进去了的,但是input( )获取输入时返回的结果是不包含末尾的换行符'\n'的。
import sys
name1 = input()
name2 = sys.stdin.readline()
print(len(name1))
print(len(name2))
输出结果:
mike
mike
4
5
因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )函数(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]这两种方法去掉换行。
# 示例二:比较使用strip方法之后的区别
import sys
name1 = input()
name2 = sys.stdin.readline()
name3 = sys.stdin.readline().strip('\n')
name4 = sys.stdin.readline()[:-1]
print(len(name1))
print(len(name2))
print(len(name3))
print(len(name4))
输出结果:
mike
mike
mike
mike
4
5
4
4
三、sys.stdin循环读取输入数据
下面给出的示例用于跟牛客网的代码解析器进行对比,结果表明,两个代码都是可以运行的,为了方便使用,推荐用第一种,第一种不好理解的话,其原理参考示例二。
# 示例:循环读取输入结果,下面的示例一是参考答案给的输入代码,但是没有弄明白这个程序怎么结束输入,
# 牛客网有自己的程序验证机制,两个程序进行对比,两个代码都是可以实现循环读取数据,
# 为了方便使用,推荐用第一种,不好理解的话,实现原理参考示例二。
import sys
# 示例一:循环读取输入的数据,不考虑以什么结尾来结束输入
names = []
for each in sys.stdin:
names.append(int(each))
print(names)
# 示例二:循环读取输入的数据,以\n结尾来结束输入
names = []
for each in sys.stdin:
if each == '\n':
break
else:
names.append(int(each))
print(names)
四、把读取输入数据拿下后,结合真题来看看求连续子数组的最大和怎么解决?
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
def Find_max_num(array):
if not array:
return None
pre_count = 0
max_count = -0xffffff
for each in array:
if pre_count < 0:
pre_count = each
else:
pre_count += each
if pre_count > max_count:
max_count = pre_count
return max_count
import sys
N = input()
nums = []
for each in sys.stdin:
nums.append(int(each))
maxnum = Find_max_num(nums)
print(maxnum)
由于牛客网上提交代码的时候不能添加中文注释,所以单独给出以下注释:
N = input() # 获取第一行的数据,数组的长度N
nums.append(int(each)) # 由于sys.stdin输入的是字符类型的数据,所以需要进行数据格式转化
好了,到这就写完了,虽然花了很长时间进行代码验证,但是还是很值得的!
最后说明:博主尊重原创,如有侵权,联系删帖,欢迎监督和提醒!
Python中的sys.stdin和input、sys.stdout与print--附带讲解剑指offer42-连续子数组的最大和的更多相关文章
- 剑指offer-连续子数组的最大和-数组-python
题目描述 例如:{6,-3,-2,7,-15,1,2,2},连续子向量的最大和为8(从第0个开始,到第3个为止). 给一个数组,返回它的最大连续子序列的和 思路:动态规划 # -*- coding:u ...
- 【剑指Offer】连续子数组的最大和 解题报告(Python)
[剑指Offer]连续子数组的最大和 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- python实现连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 剑指offer——python【第30题】连续子数组的最大和
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 29.连续子数组的最大和(python)
题目描述 HZ偶尔会拿些专业问题来忽悠那些非计算机专业的同学.今天测试组开完会后,他又发话了:在古老的一维模式识别中,常常需要计算连续子向量的最大和,当向量全为正数的时候,问题很好解决.但是,如果向量 ...
- 剑指Offer-连续子数组中的最大和
题目 输入一个整型数组,数组里有正数也有负数.数组中的一个或连续多个整数组成一个子数组.求所有子数组的和的最大值.要求时间复杂度为 O(n). 输入 [1,-2,3,10,-4,7,2,-5] 返回值 ...
- Dp解决数组中连续子数组的最大和
#include<iostream> ]; ;i<size;i++) { TempSum = CurSum; ) ...
- 对Python中列表和数组的赋值,浅拷贝和深拷贝的实例讲解
引用:https://www.jb51.net/article/142775.htm 列表赋值: 1 2 3 4 5 6 7 >>> a = [1, 2, 3] >>&g ...
- 剑指offer系列61---数组中的逆序对
[题目]在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对.输入一个数组,求出这个数组中的逆序对的总数. * [思路]运用归并排序的思想. * 首先将数组分成两个子数组,统 ...
随机推荐
- Spring笔记(3)
一.JDBC Template基本使用 1.开发步骤 1.1直接使用template 导入spring-jdbc和spring-tx坐标 <!-- JDBC--> <dependen ...
- Hopper Disassembler系列之Sublime Text 3 爆破
https://www.52pojie.cn/thread-793069-1-1.html 当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9. 当参数 ...
- 机械硬盘换到SSD后系统引导报错代码0xc000000e
由于机械硬盘IO不够用,系统使用起来非常的缓慢,特意购买了新的SSD进行了替换.机械硬盘的IO在70左右,SSD的IO在1000-4000左右指普通消费SSD. 由于不想安装系统,就直接把机械硬盘的数 ...
- zabbix 历史数据处理
问题描述 zabbix server 平稳运行有一段时间了,但是最近问题却来了,今天早上收到zabbixserver磁盘空间不足的告警.通过查看之后发现是大部分数据是zabbix 库的的数据 在进一步 ...
- MySQL版本浅介
一.关于MySQL发行版介绍: 1. MySQL官方发行版 MySQL是最流行的数据库,主要特点: 简单:MySQL使用很简单,可以无师自通地参照文档安装运行和使用MySQL,几乎没有什么门槛. 开源 ...
- [考试总结]noip模拟39
不写那么多没用的了 开题就发现 \(T4\) 原题, \(T1\) 大水题. 然后发现 \(T4\) 忘了.... 不扯了 打地鼠 大水题,我代码都不想放... 算了,还是放一下吧.. #includ ...
- ES6:使用解构赋值仅用一行定义多个相同的数组,且指向堆不同(解构赋值)
在开发过程中我们经常要用到一些临时变量对数据进行一些特殊处理,由于良好的编码习惯要在临时变量用完后释放内存,所以当临时变量数量较多时,整体代码会变得冗余. let a = [] let b = [] ...
- python动态网站爬虫实战(requests+xpath+demjson+redis)
目录 前言 一.主要思路 1.观察网站 2.编写爬虫代码 二.爬虫实战 1.登陆获取cookie 2.请求资源列表页面,定位获得左侧目录每一章的跳转url(难点) 3.请求每个跳转url,定位右侧下载 ...
- Java 语法学习2
Java基础语法二 类型转换 public class demo03 { public static void main(String[] args) { int i=128; byte a=(byt ...
- go的database/sql库中db.Exce()
db.Exec(query string, args ...interface{}) Db.Exec(`CREATE TABLE IF NOT EXISTS STU(ID int(8) PRIMARY ...