Java 无法通过密码查询测试时的性能
请检查代码并告诉我如何提高性能?这个性能问题让我对Codibility很生气。下面是问题和我的代码 谢谢你从现在起的帮助 测试: 询问描述 DNA序列可以表示为由字母A、C、G和T组成的字符串,这些字母对应于序列中连续核苷酸的类型。每个核苷酸都有一个影响因子,它是一个整数。A、C、G和T型核苷酸的影响因子分别为1、2、3和4。您将回答以下几个问题:给定DNA序列特定部分所含核苷酸的最小影响因子是什么 DNA序列以非空字符串S=S[0]S[1]…S[N-1]的形式给出,由N个字符组成。有M个查询,它们在非空数组P和Q中给出,每个查询由M个整数组成。第K个查询为0≤ KJava 无法通过密码查询测试时的性能,java,performance,Java,Performance,请检查代码并告诉我如何提高性能?这个性能问题让我对Codibility很生气。下面是问题和我的代码 谢谢你从现在起的帮助 测试: 询问描述 DNA序列可以表示为由字母A、C、G和T组成的字符串,这些字母对应于序列中连续核苷酸的类型。每个核苷酸都有一个影响因子,它是一个整数。A、C、G和T型核苷酸的影响因子分别为1、2、3和4。您将回答以下几个问题:给定DNA序列特定部分所含核苷酸的最小影响因子是什么 DNA序列以非空字符串S=S[0]S[1]…S[N-1]的形式给出,由N个字符组成。有M个查询,
例如,考虑字符串s= cAgcTa和数组p,q,以便:
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
这些M=3问题的答案如下:
位置2和4之间的DNA部分含有两次核苷酸G和C,其影响因子分别为3和2,因此答案为2。
位置5和5之间的部分包含一个单核苷酸T,其影响因子为4,因此答案为4。
位置0和6之间的部分整个字符串包含所有核苷酸,特别是影响因子为1的核苷酸A,因此答案为1。
编写一个函数:
类解决方案{public int[]solutionString S,int[]p,int[]Q;}
给定一个由N个字符组成的非空字符串S和两个由M个整数组成的非空数组p和Q,返回一个由M个整数组成的数组,指定所有查询的连续答案
结果数组应作为整数数组返回
例如,给定字符串S=CAGCCTA和数组p,Q,以便:
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
P[0] = 2 Q[0] = 4
P[1] = 5 Q[1] = 5
P[2] = 0 Q[2] = 6
函数应该返回值[2,4,1],如上所述
为以下假设编写有效的算法:
N是[1..100000]范围内的整数;
M是[1..50000]范围内的整数;
数组P,Q的每个元素都是[0..N]范围内的整数− 1];
P[K]≤ Q[K],其中0≤ K public static int[] solution(String S, int[] firstArray, int[] secondArray) {
String subStr="";
int[] result = new int[firstArray.length];
for(int i=0; i < firstArray.length; i++) {
subStr = S.substring(firstArray[i], secondArray[i] + 1);
if(subStr.contains("A")) { result[i] = 1; }
else if(subStr.contains("C")){ result[i] = 2; }
else if(subStr.contains("G")){ result[i] = 3;
} else if(subStr.contains("T")){ result[i] = 4;
}
}
返回结果;
}您的解决方案非常复杂。 外环:forint i=0;i
Idx A, C, G, T
0 [-1, 0,-1,-1]
1 [-1, 0, 1,-1]
2 [-1, 0, 2,-1]
3 [-1, 0, 2, 3]
有了这个矩阵,我们现在可以直接访问它来获得相关的值。在这种情况下,如果我们试图获得subStr GG的相关值,即P[0]=1和Q[0]=2,
然后我们只需要访问索引2。在这种情况下,[-1,0,2,-1]告诉我们,只有G在指数1之后最后一次被观察到,因此,最小影响是G到其影响因子的映射
构建矩阵的过程非常复杂。通过P和Q进行迭代是非常复杂的。由于没有嵌套循环,因此总体复杂度为+M
下面是Python实现的一个片段:
def solution(S,P,Q):
l = len(S)
lastSeen = [[-1,-1,-1,-1] for x in range(l)]
for x in range(len(S)):
for i,j in enumerate(list("ACGT")):
if S[x] == j:
lastSeen[x][i] = x
elif x>0:
lastSeen[x][i] = lastSeen[x-1][i]
res = []
for x in range(len(P)):
startIdx = P[x]
relevantLastSeen = lastSeen[Q[x]]
res.append((min([i+1 for i,x in enumerate(relevantLastSeen) if x>=startIdx])))
return res