Java 如何减少for循环的数量
如何改进这段代码,我得到了准确的输出,但似乎没有什么长的和不必要的操作。任何建议Java 如何减少for循环的数量,java,arraylist,data-structures,Java,Arraylist,Data Structures,如何改进这段代码,我得到了准确的输出,但似乎没有什么长的和不必要的操作。任何建议 public class Test { public static void main(String[] args) { List<Integer> a = new ArrayList<Integer>(); a.add(1); a.add(2); List<Integer> b = new ArrayL
public class Test {
public static void main(String[] args) {
List<Integer> a = new ArrayList<Integer>();
a.add(1);
a.add(2);
List<Integer> b = new ArrayList<Integer>();
b.add(3);
b.add(5);
System.out.println(test(5, a, b));
}
public static long test(int n, List<Integer> a, List<Integer> b) {
// Write your code here
long retCnt = 0;
List<String> enemy = new ArrayList<String>();
for (int i = 0; i < a.size(); i++) {
enemy.add(a.get(i) + "" + b.get(i));
}
String tempstr = "";
int tempj = 1;
for (int m = 1; m <= n; m++) {
int temp = 1;
for (int i = 1; i <= n; i++) {
tempstr = "";
for (int j = tempj; j <= temp; j++) {
tempstr += j;
}
temp++;
if (!"".equalsIgnoreCase(tempstr)) {
if (isValidGroup(enemy, tempstr)) {
retCnt++;
} else {
break;
}
}
}
tempj++;
}
return retCnt;
}
public static boolean isValidGroup(List<String> enemy, String group) {
for (int i = 0; i < enemy.size(); i++) {
if (group.trim().toUpperCase().contains(String.valueOf(enemy.get(i).charAt(0)).toUpperCase())&& group.trim().contains(String.valueOf(enemy.get(i).charAt(1)).toUpperCase())) {
return false;
}
}
return true;
}
}
公共类测试{
公共静态void main(字符串[]args){
列表a=新的ArrayList();
a、 增加(1);
a、 增加(2);
列表b=新的ArrayList();
b、 增加(3);
b、 增加(5);
系统输出println(测试(5,a,b));
}
公共静态长测试(int n,列表a,列表b){
//在这里编写代码
长retCnt=0;
列表敌人=新的ArrayList();
对于(int i=0;i 对于(int m=1;m而言,您的代码速度很慢。如果n为100,则您的代码将需要超过1亿次计算才能执行
但是,如果你直接跳转到无效数字所在的索引之上,整个测试函数可以在O(N)中通过一些二项式数学执行。它也可以通过下面非常简单的算法在O(N^2)中执行
为了节省内存和代码,我要做的第一件事是删除变量tempj和temp,因为你可以使用变量m和I来做同样的工作,这些变量总是有相同的关联值,无论如何,它们都必须被创建以进行正确的迭代
另一个需要注意的有用的事情是,tempj有时(更准确地说,大约在所有迭代的一半中)会比temp大。在所有这些情况下,您将找不到任何有效的排列,因为j只以递增的顺序从temp迭代到tempj。换句话说,一半的计算是无用的
Tempstr可以预先计算
假设tempj为1,temp为3。然后,J将进行2次迭代,从1到2,从2到3。J已达到temp,因此将一次添加到temp。temp现在为4,tempj仍然为1
现在,J必须执行前两个步骤才能从1到3,然后再执行一个步骤才能达到4,即温度。您可以跳过前两个步骤,因为您已经知道在它们之后tempstr会是什么样子。不要重置J,而是随着温度的增加不断增加它
下面是O(N^2)的一个片段(不考虑isValidGroup()的复杂性,可以使用布尔数组轻松优化它,在N^2中标记无效位置)
String tempstr=”“;
对于(int start=1;start)来说,非常感谢您的解释,但是我仍然担心有些测试用例会被暂停。
String tempstr = "";
for(int start = 1; start <= n; start++) {
tempstr = "";
for(int end = start; end <= n; end++) {
tempstr += end;
if(isValidGroup(enemy, tempstr)) {
retCnt++;
} else {
break;
}
}
}