2017年校招全国统一模拟笔试(第一场)编程题集合--Python

这篇博客汇总了2017年牛客网全国统一模拟笔试的编程题目,每道题都包含了输入输出描述、示例及多位牛客网用户的解答思路和正确答案。内容涉及多种编程问题,适合备考和学习编程的读者参考。
摘要由CSDN通过智能技术生成

注:试题来源于牛客网

1.

牛牛有一个鱼缸。鱼缸里面已经有n条鱼,每条鱼的大小为fishSize[i] (1 ≤ i ≤ n,均为正整数),牛牛现在想把新捕捉的鱼放入鱼缸。鱼缸内存在着大鱼吃小鱼的定律。经过观察,牛牛发现一条鱼A的大小为另外一条鱼B大小的2倍到10倍(包括2倍大小和10倍大小),鱼A会吃掉鱼B。考虑到这个,牛牛要放入的鱼就需要保证:
1、放进去的鱼是安全的,不会被其他鱼吃掉
2、这条鱼放进去也不能吃掉其他鱼
鱼缸里面已经存在的鱼已经相处了很久,不考虑他们互相捕食。现在知道新放入鱼的大小范围[minSize,maxSize](考虑鱼的大小都是整数表示),牛牛想知道有多少种大小的鱼可以放入这个鱼缸。 
输入描述:
输入数据包括3行.
第一行为新放入鱼的尺寸范围minSize,maxSize(1 ≤ minSize,maxSize ≤ 1000),以空格分隔。

第二行为鱼缸里面已经有鱼的数量n(1 ≤ n ≤ 50)

第三行为已经有的鱼的大小fishSize[i](1 ≤ fishSize[i] ≤ 1000),以空格分隔。


输出描述:
输出有多少种大小的鱼可以放入这个鱼缸。考虑鱼的大小都是整数表示

输入例子:
1 12
1
1

输出例子:
3

个人思路:

我是从输入的鱼范围大小入手,从最小到最大,以此进行判断。
与鱼缸中鱼的大小做 /,如果能除尽,就是被吃。反之,则可以增加一次大小。
我的测试用例是 30% case
1 36
1
3
答案输出 10
我的是 8
鱼缸中的一条鱼大小是 3,则可放入鱼的大小为 2,3,4,5,7,8,10,11,13,14,16,17,19,20,22,23,25,26,28,29,31....
我是真没弄明白这题的意思。来看看正确答案吧。
分割线:
在分析了一波正确答案之后,我再看题,我明白了,2倍到10倍是一个什么概念!是区间啊大哥。我理解的是,是一个数的2倍,3倍,或者...10倍中的一个。

正确答案(牛客网 id:cheeeenkun):

minSize, maxSize = map(int,raw_input().split())
n = map(int,raw_input())
fishSize = map(int,raw_input().split())
put_in = range(minSize,maxSize+1)
cannot_input = 0
for x in put_in:
    flag = 0
    for i in fishSize:
        if 2*x <= i <=x*10 or i*2 <= x <=i*10:
            flag = 1
    if flag == 1:
        cannot_input += 1
print maxSize+1-minSize-cannot_input




2.

如果一个单词通过循环右移获得的单词,我们称这些单词都为一种循环单词。 例如:picture 和 turepic 就是属于同一种循环单词。 现在给出n个单词,需要统计这个n个单词中有多少种循环单词。 
输入描述:
输入包括n+1行:

第一行为单词个数n(1 ≤ n ≤ 50)

接下来的n行,每行一个单词word[i],长度length(1 ≤ length ≤ 50)。由小写字母构成


输出描述:
输出循环单词的种数

输入例子:
5
picture
turepic
icturep
word
ordw

输出例子:
2

个人思路:

必须是右移
不,这个是相对的
例子中,ture是右移的,但是pic就是相对左移
那简单了,先对每一个单词排序,然后set,最后len(set)
当时我是这样思考的,但测试用例 70% case,错误例子:

测试用例:
7
ast
ats
tas
tsa
sat
sta
ttt

对应输出应该为:

3

你的输出为:

2
果然我考虑的循环移动是有问题的,没有彻底思考究竟是什么循环右移。看到一个思路方法:
把要测试的单词后再重复下这个单词,如:picture ,变成 picturepicture
然后判断其他要测试的单词是不是这个串的子串(长度要先相等)

正确方法(牛客网 id:周昆):

def judge(word1, word2):
    if len(word1) != len(word2):
        return False
    for i in range(len(word1)):
        if word1[i:] + word1[:i] == word2:
            return True
    else:
        return False
     
n = int(raw_input())
rec = list()
for i in range(n):
    flag = True
    word1 = raw_input()
    for word2 in rec:
        if judge(word1, word2):
            flag = False
            break
    if flag:
        rec.append(word1)
print len(rec)
这个貌似就是用了上面思路,通过 python 数组的分割 [3:] [:3] 来进行判断。就是以此把前面1,2..位的字符放到末尾去
so,循环右移就是把左边的连续字符移到右边去即可。



3.

DNA分子是以4种脱氧核苷酸为单位连接而成的长链,这4种脱氧核苷酸分别含有A,T,C,G四种碱基。碱基互补配对原则:A和T是配对的,C和G是配对的。如果两条碱基链长度是相同的并且每个位置的碱基是配对的,那么他们就可以配对合成为DNA的双螺旋结构。现在给出两条碱基链,允许在其中一条上做替换操作:把序列上的某个位置的碱基更换为另外一种碱基。问最少需要多少次让两条碱基链配对成功 
输入描述:
输入包括一行:
包括两个字符串,分别表示两条链,两个字符串长度相同且长度均小于等于50。


输出描述:
输出一个整数,即最少需要多少次让两条碱基链配对成功

输入例子:
ACGT TGCA

输出例子:
0

个人思路:

这题是属简单题,我这里用了先得出一条链的配对链,然后去计算另外一条链需要变化多少次

正确答案(本人&&牛客网 id:Panzerfaust):

def combine(arr):
    wife = []
    for a in arr:
        if a == 'A':
            wife.append('T')
        elif a == 'T':
            wife.append('A')
        elif a == 'C':
            wife.append('G')
        elif a == 'G':
            wife.append('C')
    return wife

arr = [s for s in raw_input().strip().split()]
a = list(arr[0])
b = list(arr[1])
c = combine(a)
i = 0
count = 0
while i < len(a):
    if c[i] != b[i]:
        count += 1
    i += 1
print count
精简的代码;
try:
    while 1:
        line = raw_input().split()
        count =0 
        tmp = ["AT","TA","GC","CG"]
        for i in range(len(line[0])):
            if line[0][i]+line[1][i] not in tmp:
                count+=1
        print(count)
except:
    pass
这个妙啊,妙啊,妙啊!!!



4.

牛牛的好朋友羊羊在纸上写了n+1个整数,羊羊接着抹除掉了一个整数,给牛牛猜他抹除掉的数字是什么。牛牛知道羊羊写的整数神排序之后是一串连续的正整数,牛牛
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值