蔚来 2022 07 27 算法岗笔试算法题
1.题目可以转化为 给定n个连续空间(left, right)和m个数组成的单调增数组,如何高效查找数组里面的数是否在连续空间里面?
手写二分就行。
def binary_search(left, right, valid_idx): # valid_idx is ascending list if left > valid_idx[-1] or right < valid_idx[-1] : return False l,r = 0, len(valid_idx) -1 while l < r: mid = (l + r) >> 1 if valid_idx[mid] < left: l = mid + 1 else: r = mid if valid_idx[l] <= right: return True return False
2.题目: 给定一个数组 对数组里面的数进行操作, 操作是乘一个质数, 要求最少操作多少次, 能够使得数组任何两个元素相乘为完全平方数?(数据范围3*10^5 复杂度应该在nlogn到n2之间,单个数的范围是在10^5到10^9之间)
思路是:将任何一个数拆开为质数相乘,统计每个数的质数个数和种类即可。
本质是一个质因数分解。如何分解也是一个问题
3.题目: 给定一个数组,可以对数组进行操作,操作是将任意一个元素移到开头或者结尾,问最少操作多少次能够使得数组变成非严格升序数组?(数据范围3*10^5 复杂度应该在nlogn到n2之间)
没写出来,
思路是: 将原数组排序,求原数组与排序后数组的最长连续子串,然后总的长度-最长连续子串即可。
比如 [4,3,5,7,6] 排序后为 [3,4,5,6,7]
最长连续子串为[4,5,6] 注意这个最长连续指的是在排序中连续
答案为 5 - 3 = 2
总评价:难
没写出来是我最近没怎么刷题,一时没想到解法。 哎
#蔚来笔试#