字节测开笔试10-15

第一题:好串的数目

小红有一个字符串,例如000001111011011,然后啥叫好串呢,就是前一半全0后一半全1,或者前一半全1后一半全0就是好串,问最长的好子串长度多长(连续子串是好串)。

前缀和

具体来说,有一个数组zeros用来存连续0的数目,有一个数组ones用来存连续1的数目,然后从1遍历到n,分2种情况,例如最长子串为前半0后半1的情况,就只需要找ones中有没有ones[i]可以和前面的构成好串,例如ones[i] = 2,那就去往前回退2格去看zeros[i-2](连续1的数目)是不是能够容纳下ones[i],如果能的话,那就可以构成至少长度为min(ones[i],zeros[i-ones[i]])*2的好子串。

代码如下:

s = input().strip()
arr = [int(x) for x in s]
n = len(arr)
zeros = [0]
ones = [0]
for x in arr:
    if x==0:
        zeros.append(zeros[-1]+1)
        ones.append(0)
    else:
        zeros.append(0)
        ones.append(ones[-1]+1)
zeros = zeros[1:]
ones = ones[1:]

res = 0
for i in range(n):
    #前一半0,后一半1
    if i-ones[i]>=0:
        res = max(res,min(ones[i],zeros[i-ones[i]])*2)
        res = max(res,min(zeros[i],ones[i-zeros[i]])*2)
print(res)

第二题:
一个坐标轴(1维)上有n个人,同时也有n个宝箱,然后位置各不同,同时还有一个终点p,任务就是这些人要去每人拿一个宝箱然后跑到终点去,每走一步消耗时间1,拿宝箱不耗时。请问最短的时间和?

输入:
n,p 代表n个人和终点p
一行整数,代表n个人坐标
一行整数,代表n个宝箱坐标
n是10^5量级

样例
input
3 3
1 4 3
2 5 6

output
11

贪心

对所有人和所有物品排序,让所有人尽可能拿离他们近的物品,然后直接跑到终点去

代码如下:

n,p = list(map(int,input().strip().split()))
a = list(map(int,input().split()))
b = list(map(int,input().split()))
a.sort()
b.sort()
res = 0
for i in range(n):
    res += abs(b[i]-a[i]) + abs(p-b[i])
print(res)

#字节##字节笔试#
全部评论
又收到面试吗
点赞 回复 分享
发布于 2023-10-16 15:58 陕西
有收到面试吗
点赞 回复 分享
发布于 2023-10-16 16:04 湖南
佬,笔试题是有两道算法题吗?还有其他题型吗?😃😃😃
点赞 回复 分享
发布于 2023-10-20 22:46 山东

相关推荐

3 10 评论
分享
牛客网
牛客企业服务