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;
        }
    }
}