腾讯音乐9月26日笔试
求大佬帮我看一下第二题(元素乘积尾部0大于x的子数组个数)解法哪里有什么问题
只能过20%,没有报时间复杂度错误
import java.util.*;
public class code2 {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param a int整型ArrayList
* @param x int整型
* @return int整型
*/
public int get_mod_2(int x) {
int res = 0;
while (x%2==0) {
res++;
x /= 2;
}
return res;
}
public int get_mod_5(int x) {
int res = 0;
while (x%5==0) {
res++;
x /= 5;
}
return res;
}
public int getSubarrayNum (ArrayList<Integer> a, int x) {
// write code here
long[][] cnt_arr = new long[2][a.size()]; // 记录因子有多少2 因子有多少5
for (int i = 0; i < a.size(); i++) {
cnt_arr[0][i] = get_mod_2(a.get(i));
cnt_arr[1][i] = get_mod_5(a.get(i));
}
int[] records = new int[a.size()]; // 以下标开始,存的数是区间的终止位置,区间内的数相乘结尾至少有x个0,且保证区间最短
for (int i = 0; i < a.size(); i++) {
records[i] = -1;
}
long record_2 = 0;
long record_5 = 0;
int begin_index = 0;
for (int end_index = 0; end_index < a.size(); end_index++) {
record_2 += cnt_arr[0][end_index];
record_5 += cnt_arr[1][end_index];
while (record_2 >= x && record_5>=x) {
records[begin_index] = end_index;
record_2 -= cnt_arr[0][begin_index];
record_5 -= cnt_arr[1][begin_index];
begin_index++;
}
}
int res = 0;
for (int i = 0; i < records.length; i++) {
if (records[i] == -1) break; // 当前位置为-1,表示后面区间所有的数相乘都不能得到末尾有两个0的数
res += ((a.size()-records[i]) % ((int)(Math.pow(10,9)+7))); // 当前位置开头的结果
}
return res;
}
}
查看22道真题和解析