第一题:小红大战小紫
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小红正在和小紫对战,给定两个人的胜场数量,请你判断最终是谁获胜了。
输入描述:
两个正整数a,b用空格隔开。a代表小红的胜场,b代表小紫的胜场。 1≤a,b≤109
输出描述:
如果小红获胜了,请输出"kou"。如果小紫获胜了,请输出"yukari"。如果最终平局,请输出"draw"。
示例1
输入
3 1
输出
kou
示例2
输入
114514 114514
输出
draw
a,b =input().split(' ')
#复习点1
#开始时直接是int(a) int(b) 这是错误的!
#int()函数不会改变原数据类型,而是返回一个新的数据(新内存空间)
a=int(a)
b=int(b)
#复习点2
#这里用if elif else ;而不是用多个if目的有二
#1【if elif else 分情况时连用可以简化代码书写】
#2【可减少搜索所消耗的计算资源,多级判断只需对剩余搜索空间搜索即可】
if a==b:
print("draw\n")
elif a>b:
print("kou\n")
else:
print("yukari")
第二题:小红的白日梦
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小红经常会做梦,但她比较喜欢做白日梦。
已知小红白天做梦可以获得 2 点幸福度,晚上做梦可以获得 1 点幸福度。现在给定小红每天中午和晚上睡觉的做梦情况。她可以每天将晚上的梦提前移到白天来做,请问小红总共最多可以获得多少幸福度?
注:只有当白天没做梦且晚上做梦的时候才可以移动梦境。
输入描述:
第一行输入一个正整数n,代表总天数。 第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天中午的做梦情况。 第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天晚上的做梦情况。 'Y'代表做梦了,'N'代表没做梦。 1≤n≤105
输出描述:
一个整数,代表最多的幸福度。
示例1
输入
4 NNNN NNNN
输出
复制0
说明
小红一个梦都没做,最终幸福度为 0。
n= int(input())#记录天数总数
Noon = [i for i in input()]
Night = [i for i in input()]
#用Noon、Night列表记录睡眠数据
welling = 0#初始化幸福指数
for t in range(n):#这里定义一个临时变量存储每日的索引
#搜索每日的睡眠数据
#先看看是不是特殊情况
if (Noon[t]=="N")and (Night[t]=="Y"):
welling+=2
#如果不是就意味着不可改变做梦时段
else:
#对(中、晚)的信息检测统计即可
if Noon[t]=="Y":
welling+=2
if Night[t]=="Y":
welling+=1
print(welling)
第三题:小红的小小红
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld
题目描述
小红拿到了一个字符串,其中一定包含连续子串"xiao",和连续子串"hong"。
请你将字符串重排,使得该字符串包含"xiaohong"的连续子串。
输入描述:
输入一个仅包含小写字母的字符串,长度不超过10^5 保证字符串一定包含"xiao"子串和"hong"子串。
输出描述:
重排后的字符串。有多解时输出任意即可。
示例1
输入
honghongxiao
输出
xiaohonghong
示例2
输入
xaohonghonxiao
输出
xaoxiaohonghon
string = input()
Ord_Str = string
#输出的串只要是不和原串一样就行
#在原串中找"xiao"子串,找到一个之后删除,修改的结果存储在string中
string = string.replace("xiao","",1)
#类似找"xiao",找"hong"
string = string.replace("hong","",1)
#都找到之后将他们“提出来”方法是将他们分别在原串中删除
#题目要求决定了该删除操作一定成功
#我们选择一个输出方式,但前提是不能和原串一样
#这里可以用“是0则1是1则0 保异”的方式确保前不等于后
if Ord_Str != string+"xiaohong":
print(string+"xiaohong")
else:
print("xiaohong"+string)
第四题:小红的中位数
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
小红拿到了一个数组:a1,a2,...,an。她定义 f(i) 为,删除第iii个元素后,数组的中位数。现在小红想让你求出f(1),f(2)...f(n)的值,你能帮帮她吗?
输入描述:
第一行输入一个正整数n,代表数组的大小。 第二行输入n个正整数ai,代表数组的元素。 2≤n≤105 1≤ai≤109
输出描述:
输出n行,每行输出一个浮点数,第i行代表f(i)的值。保留一位小数。
示例1
输入
4 2 5 8 1
输出
5.0 2.0 2.0 5.0
示例2
输入
3 1 2 3
输出
2.5 2.0 1.5
import copy
def med (x:int,ar:list):#定义求中位数函数
Arr = copy.deepcopy(ar)#先声明一个数组的副本
#这里将会消耗一些时间,大约是O(n)
#这里把副本目标元素删除了
Arr.remove(x)
#然后在这里对删除后的数组进行"快排"大约是(n*logn -> n^2)
Arr = sorted(Arr)
#接下来对几个数据进行判断处理,时间复杂度是常量级的因此是O(1)
#START
if len(Arr)%2 ==0:
a = Arr[int((len(Arr)/2)-1)]#len 函数会读取对象预定义好的len数据,因此时间复杂度是O(1)
b = Arr[int((len(Arr)/2))]
re = (a+b)/2
else:
re = Arr[int(((len(Arr)+1)/2)-1)]
#OVER
print(f'{re:.1f}')
n = int(input())
#通过列表存储输入数据,其时间复杂度是O(n)
arr = [int(i)for i in input().split(" ")]
for i in range(n):
#这里循环遍历并调用函数,时间复杂度应为O(n*time(med))
med(arr[i],arr)
#到这时间复杂度应约为O(n+n*(n+n^2))≈O(n^3)
这种方法时间复杂度达到了O(n^3)案例只通过30%
看来要优化一下了!!
旧思路:
·对每一个元素删除的列表结果进行遍历寻找,
“遍历”是n
"寻找过程"包括"排序"(最复杂复杂度部分)是O()
嵌套后应该是O()
新思路:
排序大概率无法避免,那遍历能不能优化呢?
遍历被优化,理想为O(1),这说明了,排序只需排一次,遍历被优化成“常量级”
·对要删除的元素位置进行分类讨论,获得中位数结果
优化后应该是O()
def med (x:int):#定义求中位数函数
#如果数组元素数量是奇数:
#要删除的元素在"左"--->med = (list[l+1]+list[x+2])/2
#要删除的元素在"中"--->med = (list[m-1]+list[x+1])/2
#要删除的元素在"右"--->med = (list[r-2]+list[x-1])/2
if len(arr)%2==1:
if x <= int(((len(arr)-1)/2)-1):
re = (arr[int(((len(arr)-1)/2))]+arr[int(((len(arr)-1)/2)+1)])/2
elif x == int(((len(arr)+1)/2)-1):
re = (arr[x-1]+arr[x+1])/2
else:
re = (arr[int(((len(arr)-1)/2)-1)]+arr[int(((len(arr)-1)/2))])/2
#后面做类似以上的讨论
#如果数组元素数量是偶数:
#要删除的元素在"左"--->med = list[l+1]
#要删除的元素在"右"--->med = list[r-1]
else:
if x<= int((len(arr)/2)-1):
re = arr[int((len(arr)/2))]
else:
re = arr[int((len(arr)/2)-1)]
print(f'{re:.1f}')
n = int(input())
#通过列表存储输入数据,其时间复杂度是O(n)
arr = [int(i)for i in input().split(" ")]
#下面有点绕。。。。
#我们要通过存储原序列下标关键字存储其元素信息
#将找到的元素信息作为关键字找到排序后的元素下标信息
#这两个字典生成式时间复杂度O(2n)
#->以便以原序列顺序进行"删除元素操作"
dic= {ind:i for ind,i in enumerate(arr)}
#这里先记录一下元素没排序的位置
arr.sort()
di ={i:ind for ind,i in enumerate(arr)}
for i in range(n):
med(di[dic[i]])
#总地来看,时间复杂度为O(n^2+n)≈O(n^2)
这个解是能通过题目的