网易笔试
第一题
- 题目描述
小红拿到了一个数组,每个数字被染成了红色或蓝色。她希望取一段连续区间,区间内红色的乘积为x,蓝色的数的乘积为y。小红希望x末尾0的数量以及y末尾0的数量总和不小于k。小红想知道求出区间长度的最小值,你能帮帮她吗? - 输入描述:
- 第一行输入两个正数n,k,分别代表数组的长度,末尾0数量的总和最小值。
- 第二行输入n个正整数 a i a_{i} ai,代表小红拿到的数组。
- 第三行输入一个仅包含’R’和’B’的字符串,第i个字符为’R’代表数组第i个数被染成红色,'B’代表被染成蓝色。
- 1<=n,k<=2* 1 0 5 10^{5} 105
- 1<= a i a_{i} ai<= 1 0 9 10^{9} 109
- 输出描述:
输出一个整数,代表区间长度的最小值。保证存在所描述的区间。 - 示例:
- 输入
- 5 2
- 1 4 15 8 5
- B R R B B
- 输出
- 4
- 说明:
取区间[2,5],红色的数的乘积为4*15=60,蓝色的数的乘积为8*5,各有一个末尾的0,总共有两个,可以证明,若区间的长度小于4,无法使得最终末尾的总和达到2。
自己写了一种方法,不确定可不可以全AC,但测试用例可以通过,采用滑动窗口法,语言为python。
class Solution():
def minArrayLen(self,s:int,nums:list[int], color:list[str]) -> int:
if not nums:
return 0
n = len(nums)
ans = n + 1
start,end = 0,0
list_red = []
list_blue = []
zero_num = 0
while end < n:
if(color[end]=='R'):
list_red.append(num[end])
else:
list_blue.append(num[end])
zero_num = self.get_list_zero(list_red) + self.get_list_zero(list_blue)
while zero_num>=s:
ans = min(ans,end-start+1)
if(color[start]=='R'):
list_red.pop(0)
else:
list_blue.pop(0)
zero_num = self.get_list_zero(list_red) + self.get_list_zero(list_blue)
start+=1
end+=1
return 0 if ans == n+1 else ans
def get_list_zero(self,list):
num2=0
num5=0
for num in list:
while num % 2 ==0:
num = num / 2
num2 +=1
while num % 5 ==0:
num = num / 2
num5 +=1
return min(num2,num5)
if __name__ == '__main__':
# n,s = list(map(int,input().split()))
# num = list(map(int,input().spilit()))
# color = list(map(str,input().split()))
num = [1,4,15,8,5]
color = ['B', 'R', 'R', 'B', 'B']
result = Solution().minArrayLen(s,num,color)