编程考试

牛客网输入

  • 输入sys.stdin.readline().split()
  • 输出print()

输入:
1.一行中两个或三个整数。

import sys
n, m = map(int, sys.stdin.readline().strip().split())
或:
a,b,c=[int(i) for i in input().split()]

2.一行整数输出为1个列表:

n = [int(i) for i in input().split()]

3.读入字符串

chars = sys.stdin.readline()

输出:
1.把列表[1,2,3]输出成1 2 3

print (" ".join(map(str, nums)))

2.把[[1,2,3],[2,3,4]]输出为:

1 2 3
2 3 4
for i in range(n):
	print(" ".join(map(str,matrix[i])))

4.多行输入: 先获取第一行,再把剩余行合在一个列表中:
1 5 6
1
3

a,b,c=[int(i) for i in input().split()]
list=[]
for i in range(hangshu):
    list.append([int(i) for i in input().split()])
    print(list)
a,b,c=[int(i) for i in input().split()]
list=[]
for i in range(hangshu):
    list.extend([int(i) for i in input().split()])
    print(list)
  • append:
    在这里插入图片描述

  • extend:
    在这里插入图片描述

  • 多行输入:行数固定且第一行给出,各行独立获取:

import sys 
lines = sys.stdin.readlines()
n = int(lines[0])
x1 = list(map(int, lines[1].split()))
x2 = list(map(int, lines[2].split()))
x3 = list(map(int, lines[3].split()))
print(n,x1,x2,x3)

输入:

3
1 5 6
1
8

输出:
在这里插入图片描述

  • 第一行读取为int型
  • 其余行读取为list类型
  1. 常用字符串、列表操作
    字符串:
.strip() 去除首位空格
.split() 分割
.strip().strip(-a’)去除首位空格和字符‘-a’
.replace(‘a’,’b’) 替换字符
S[:3]、S[5:] 、S[5:7](前3、第5之后、57)拼接字符串,去除某个字符
.index(str,beg,end) 返回开始索引或异常
.find(str,beg,end) 返回开始索引或-1

列表:

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

赛码网

建议使用input()输入。使用sys.stdin.readline()默认会带换行符,所以要strip(’\n’)进行截取,使用sys.stdout.write(res)标准输出。

'''
输入:
5
(1,2)(5,3)(4,6)(7,5)(9,0)
output:
(4 6)(7 5)(9 0)
'''
nums = int(input())
points = []
for i in range(0, nums):
    read_list = list(map(int, input().split()))
    # read_list = [int(i) for i in input().split()]
    points.append((read_list[0], read_list[1]))
for i in points:
    print(i[0], i[1])

note:
输出要注意,按行遍历输出,而不是输出一个list或者tuple

读取一个处理(输出)一个,全部读进来之后处理在全部输出就是0。
赛码网线下测试没问题,线上测试一直AC为0,折腾了半天。发现原来是因为写代码时带了一行中文注释。

赛码网 :https://exercise.acmcoder.com/online/online_judge_list_all
1.股神:
观察当前数前有几个减号。如 14-3*2=8 (三个)
在这里插入图片描述

while 1:
    x =int(input())
    k = 3
    n = 3
    while x-k>=n:
        n+=k
        k+=1
    if  x<3:
        print(x)
    else:
        print((x-(k-2)*2))

2.翻转数组
先对输入的数进行一个排序,在原始的数组中和排序的数组中找到他们不相同的部分,看看反转后相等吗。
1.列表推导式书写形式:  
[表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]

n=int(input())
a=[int(i) for i in input().split()]
b=sorted(a)
c=[a[i] for i in range(n) if a[i]!=b[i]]
d=[b[i] for i in range(n) if a[i]!=b[i]]
c.reverse()
if c==d:
    print("yes")
else:
    print("no")

3.约德尔测试
学会怎么判断数字和字母用 .isalnum(),练习了上次学习到的列表推导式。isdigit(),isalpha()

a = input()
b = input()
c = [ ]
for char in a:
	if char.isalnum():
		c.append(1)
	else:
		c.append(0)
b = list(b)
d = [b[i] for i in range(len(b)) if int(b[i])== int(c[i])]
percent = 100*float(len(d))/len(b)
print("%.2f%%" % percent)  # %.2f是将该浮点数float保留2位小数。%%:。第一个%起到转义的作用,第二个%输出百分号%。

在这里插入图片描述

4.路灯

a = [int(i) for i in raw_input().split()]
b = [int(i) for i in raw_input().split()]
b = sorted(b)
c = [b[i+1] - b[i] for i in range(len(b)-1)]
d = max(c)
d = max([d/2.0, b[0], a[1]-b[-1]]) # 后两个数是考虑第一个路灯和最后一个路灯
print '%.2f' % d # 输出2.50

5.计算器的新功能

def factorList(n):
    i = 2
    flist = []
    while(i*i <= n):
        while(n%i==0):
            flist.append(i)
            n /= i
        i += 1
    if(n!=1):
        flist.append(n)
    return flist

def list2char(flist):
    charList = []
    for i in xrange(len(flist)):
        for c in str(flist[i]):
            charList.append(int(c))
        if i<(len(flist)-1):
            charList.append('*')
    return charList

def printRes(clist):
    row1 = [" - ","   "," - "," - ","   "," - "," - "," - "," - "," - "," "]
    row2 = ["| |","  |","  |","  |","| |","|  ","|  ","  |","| |","| |"," "]
    row3 = ["   ","   "," - "," - "," - "," - "," - ","   "," - "," - ","*"]
    row4 = ["| |","  |","|  ","  |","  |","  |","| |","  |","| |","  |"," "]
    row5 = [" - ","   "," - "," - ","   "," - "," - ","   "," - "," - "," "]
    chars = [row1,row2,row3,row4,row5]
    for i in range(5):
        out = []
        for n in clist:
            if n == "*":
                out.append(chars[i][10])
            else:
                out.append(chars[i][n])
        print "".join(out)

while True:
    arr = int(raw_input())
    flist = factorList(arr)
    # print "arr = ",flist
    charList = list2char(flist)
    # print "charList = ",charList
    printRes(charList)

6.公交车乘客

n = int(raw_input())
people = []
number = 0
for i in range(n):
	u_d = [int(i) for i in raw_input().split(' ')]
	number = number - u_d[0] + u_d[1]
	people.append(number)
print max(people)

假设当第k个熊取完之后还有M个苹果,按照题目的意思,M除以N的余数恰好是1,那么第k+1只熊可以拿到(M-1)/N个苹果,第k只熊取之前有MN/(N-1)+1个苹果。换句话说,这堆苹果满足一个性质,对于每一只熊,取之前取之后的苹果数除以N都余1,取之后的苹果数整除(N-1)。
这样考虑的话,我们可以从最后一只熊开始向前倒推总的苹果数num,最后一只熊取走了N份苹果中的1份,所以剩下的苹果一定为N-1的倍数,所以num初始值一定为N-1的倍数。
把num初值为 N-1之后,开始倒推,上一只熊取之前的苹果数为num = num + num/(N-1)+1,再判断这个数字能否被N-1整除,若可以,继续向前倒推,若不能,说明num不满足条件,将num初值更新为2
(N - 1),重复上述过程,若num不满足条件,再设置为3*(N-1),依次类推,直到循环中的num都能被N-1整除,这时候的num为满足条件的最小值,可能说的不是很清楚,直接看代码

n=input()
j=1
num=n-1
i=0
while(i<n):
    if num%(n-1)!=0:
        i=0
        j=j+1
        num=(n-1)*j
    else:
        i=i+1
        num=num+1+num/(n-1)
print(num)

8.马路上的路灯

l,n=raw_input().split()
a=[1 for i in range(int(l))]
for j in range(int(n)):
    st,en=raw_input().split()
    for k in range(int(st),int(en)+1):
        a[k-1]=0
print a.count(1)+1

9.日期倒计时
strptime()函数根据指定的格式把一个时间字符串解析为时间元组。
%Y 四位数的年份表示(000-9999),%m 月份(01-12),%d 月内中的一天(0-31)

import datetime
d1 = datetime.datetime.strptime(raw_input(), '%Y-%m-%d')
now = datetime.datetime(2015, 10, 18)
print (d1-now).days

10.比大小
假如,给出的第一位是b(给出的这个字符串简称str),那么所有以a开头的字符串都会排在str前面。以a开头的字符串的数量是多少呢?就是后面11位字符所有的排列组合,也就是11的阶乘。如果第一位是c,那么所有以a或者b开头的所有字符串就会排在str的前面,也就是 2*11! (注意后面是11的阶乘,不是11),依次类推,可以知道第一位是任意字符时排在str前面的字符串的数量。接着看第二位,第二位的思路和第一位一样,同样可以知道第二位是任意字符时排在str前面的字符串的数量,以此类推,后面的字符都算完之后,把全部结果相加
但是,这个时候还有一个问题,在这道题中12个字符是固定的,所以假如第一位不是a,是b,那么a在后面的字符中一定会出现,同时b也不会再出现,所以在进行上面的计算时,不能直接以字典序来进行计算,在计算每一位时要根据尚未出现过得字符的顺序,来排列未出现的字符的顺序,具体看代码里的注释,不明白的地方debug一步一步看。

import math
def index(s):
    sum = 1
    for i in range(len(s)):
        s1 = s[i:]
        n = 0
        for j in s1:
            if s[i]>j:
                n += 1
        sum += math.factorial(11-i)*n  # 求阶乘
    return sum
n = int(input())
for i in range(n):
    s = raw_input()
    print(index(s))
while 1:
    a_b_s = [int(i) for i in raw_input().split()]
    a = abs(a_b_s[0])
    b = abs(a_b_s[1])
    s = abs(a_b_s[2])
    l = s - a - b
    if l < 0:
        print 'No'
    elif l%2 == 0:
        print 'Yes'
    else:
        print 'No'
N = int(raw_input())
def f(a,b,c,d):
    s = a + b + c + d
    if a >= 60 and b >=60 and c>=90 and d>=90:
        if s >= 310:
            if s>=350:
                print 'Gongfei'
            else:
                print 'Zifei'
        else:
            print 'Fail'
    else:
        print 'Fail'
        
for i in range(N):
    a, b, c, d = tuple(map(int,raw_input().split(' ')))
    f(a,b,c,d)

##:删除前两位
#:删除前一位
@:将本行已经收到的都删除掉

num = int(raw_input())
for i in range(num):
    ch_list = []
    chars = list(raw_input())
    for ch in chars:
        if ch == '#' and ch_list:
			ch_list.pop()
        elif ch == '@':
        	ch_list = []
        elif ch != '#':
        	ch_list.append(ch)
    print("".join(ch_list))
input = [int(i) for i in raw_input().split()]
n = input[0]
data = []
for i in range(n):
    data.append([input[2*i+1], input[2*i+2]])
max_t = max([j[1] for j in data])
def f(x, t):
    if t < max_t:
        return (1 if [x,t] in data else 0) + max(f(x-1, t+1),f(x, t+1),f(x+1, t+1))
    else:
        return (1 if [x,t] in data else 0)

print(f(5,0))
n, m = raw_input().split(" ")
t1, t2, t3, t4 = raw_input().split(" ")
sum1 = (abs(int(n) - int(m)) + int(n) - 1) * int(t1) + 2*int(t2) + int(t3)
sum2 = int(t4) * (int(n) - 1)
print(sum1 if sum1 < sum2 else sum2)

添加一个字符转为拿掉一个字符,检测结果是一样的。

import sys
str1 = raw_input()
for i in range(len(str1)):
	if str1[:i] + str1[i+1:] == (str1[:i] + str1[i+1:])[::-1]:
		print 'Yes'
		sys.exit()
print 'No'
def mm(a,b):
    while a%b !=0:
        a,b = b,(a%b)
    return b
while(1):
    m = [int(i) for i in raw_input().split()]
    n = [int(i) for i in raw_input().split()]
    a = m[1]
    for i in n:
        if a >= i:
            a += i
        else:
            a += mm(a, i)
    print a
n, m = list(int(i) for i in raw_input().split())
nums = list(int(i) for i in raw_input().split())
cut = 0
sm = m
for i in range(n):
	if sm - nums[i] >= 0:
		sm = sm - nums[i]
	else:
		cut += 1
		sm = m - nums[i]
print cut + 1
import math
r, x, y, x1, y1 = map(int, raw_input().split())
print  int(math.ceil(math.sqrt(( (x1-x)**2 + (y1-y)**2))/(2*r)))

勾股定理l+=(4*(r_max*2-1))0.5其实是2((r_max2-1)**0.5)

a=raw_input()
n=a[0]
b=a[1:].split()
c=[]
for i in b:
    c.append(float(i))
l=0
for i in range(int(n)):
    r_max=max(c)
    c.remove(r_max)
    l+=(4*(r_max**2-1))**0.5
    if l>=20:
        break
print i+1

如果你想在笔试中用到ListNode来创建节点,你需要声明一个类,不要注释掉。

while True:
    try:
        class ListNode(object):
            def __init__(self,val):
                self.val = val
                self.next = None
        n = input()
        if n == 0:
            print None
        else:
            head = ListNode(0)
            line = raw_input().strip()
            k = input()
            if k == 0:
                print 0
            else:
                array = [int(a) for a in line.split()]
                node = head
                for i in range(n):
                    new = ListNode(array[i])
                    node.next = new
                    node = new
                head = head.next
                p1 = head
                p2 = head
                for i in range(k):
                    p1 = p1.next
                while p1:
                    p1 = p1.next
                    p2 = p2.next
                print p2.val
    except:
        break
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值