![](/img/trans.png)
[英]How do I reduce the “Cyclomatic Complexity” of the following code
[英]How do I reduce the time complexity for the following code?
如何降低以下代码的时间复杂度?
我必须检查查询中的单词是否存在于句子中并打印句子编号,否则打印“ -1”。
单词的顺序在查询中无关紧要。 它们应该出现在句子中,就是这样。
课程结果{
static boolean o=false;
public static void textQueries(List<String> sentences, List<String> queries) {
// Write your code here
String[] s, se;
ArrayList<HashSet<Integer>> arr=new ArrayList<>();
for(int i=0; i<queries.size(); i++) {
s=queries.get(i).split(" ");
HashSet<String> set=new HashSet<>(Arrays.asList(s));
for(String str : set) {
HashSet<Integer> q=new HashSet<>();
for(int j=0; j<sentences.size(); j++) {
se=sentences.get(j).split(" ");
HashSet<String> sen=new HashSet<>(Arrays.asList(se));
if(sen.contains(str)) {
q.add(j);
}
}
arr.add(q);
}
for(int d=0; d<sentences.size(); d++) {
print(d, arr);
}
if(o==false)
System.out.print("-1");
System.out.println();
arr.clear();
o=false;
}
}
public static void print(int d, ArrayList<HashSet<Integer>> arr) {
for(int a=0; a<arr.size(); a++) {
HashSet<Integer> st=arr.get(a);
if(!st.contains(d))
return;
}
o=true;
System.out.print(d+" ");
}
}
这是我认为是改进的版本:
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
List<String> sentences = Arrays.asList("a bc def", "bc, ajj");
List<String> queries = Arrays.asList("a bc def");
textQueries(sentences, queries);
}
public static void textQueries(List<String> sentences, List<String> queries) {
int counter = 0;
outer:
for (String sentence : sentences) {
System.out.println("Process sentence: " + sentence + " nr. " + (++counter));
List<String> sentenceWords = Arrays.asList((sentence.split(" ")));
for (String query : queries) {
if (sentenceWords.containsAll(Arrays.asList((query.split(" "))))) {
System.out.println(counter);
continue outer;
}
}
System.out.println(-1);
}
}
}
public static void textQueries(List<String> sentences, List<String> queries) {
final List<Set<String>> sentencesWords = getSentenceUniqueWords(sentences);
final Function<Set<String>, Set<Integer>> findSentencesWithAllWords = words -> {
int pos = 0;
Set<Integer> positions= new TreeSet<>();
for (Set<String> sentenceWords : sentencesWords) {
if (sentenceWords.containsAll(words))
positions.add(pos);
pos++;
}
return positions;
};
for (String query : queries) {
Set<Integer> positions= findSentencesWithAllWords.apply(getUniqueWords(query));
if (positions.isEmpty())
System.out.println(-1);
else
System.out.println(positions.stream()
.map(String::valueOf)
.collect(Collectors.joining(" ")));
}
}
private static List<Set<String>> getSentenceUniqueWords(List<String> sentences) {
return sentences.stream()
.map(sentence -> getUniqueWords(sentence))
.collect(Collectors.toList());
}
private static final Pattern SPACES = Pattern.compile("\\s+");
private static Set<String> getUniqueWords(String str) {
return Arrays.stream(SPACES.split(str)).collect(Collectors.toSet());
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.