Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 最佳解决方案是什么?_Java_Arrays_Algorithm - Fatal编程技术网

Java 最佳解决方案是什么?

Java 最佳解决方案是什么?,java,arrays,algorithm,Java,Arrays,Algorithm,给定n>=0,用模式{1,1,2,1,2,3,…1,2,3..n}创建一个数组 例如,如果给定n=3,则方法应将数组返回为{1,1,2,1,2,3} 我的解决办法是 public int[] upSeries(int n) { int var1 = n + 1; int var2 = n; int var3 = (var1*var2) / 2; int arr_length = var3; int value = 1; int i

给定n>=0,用模式{1,1,2,1,2,3,…1,2,3..n}创建一个数组

例如,如果给定n=3,则方法应将数组返回为{1,1,2,1,2,3}

我的解决办法是

public int[] upSeries(int n) {

    int var1 = n + 1;        
    int var2 = n;
    int var3 = (var1*var2) / 2;
    int arr_length = var3;
    int value = 1;
    int index = 0;
    int[] arr = new int[arr_length];
    for (int j = 0; j < arr.length; j++) {
        for (int p = 0; p < j + 1; p++) {
            arr[index] = value;
            value++;

            if (index == arr.length - 1) {
                arr[index] = n;
                break;
            } else {
                index++;
            }
        }
        value = 1;
    }
    return arr;
}

什么是最好的解决方案?

Ruchi,你的循环需要^2次-更准确地说,它需要nn+1/2次。但是,由于这也是阵列的大小,因此不可能做得更好。

我将其清理了一点。但总的想法是一样的。你有一些本可以删除的冗余

public int[] upSeries(int i) {
    assert i >= 0;        

    int[] array = new int[(i * (i+1)) / 2)];  // Standard Sum
    int seriesnum = 1;
    int seriesmax= 1;
    for (int index=0; index < array.length; index++) {
        array[index] = seriesnum;            

        if (seriesnum++ == seriesmax) {
            seriesnum = 1;
            seriesmax++;
        }
    }

    return array;
}
此解决方案最好采用常数倍数。如果你正在寻找大的Oh,它们都是Oi^2,不可能做得更好


如果你需要证明为什么不可能做得更好。首先证明返回数组的大小为i*i+1/2。然后论证你必须填充数组中的每个位置。如果你做得比Oi^2好,那么你还没有填满数组中的每个位置。

你认为循环很好,这种列表的效率是有限的,但是你的代码可以稍微清理一下。var1有点无用,var2只有在我很奇怪的时候才有用,否则它是不准确的,var3完全没有功能。数组的长度将是1到i或∑i或int arr_length=i*i+1/2。您甚至可以将该求和放在数组声明中,以便更容易理解

由于整数运算,您的代码对于偶数输入都失败

例如@RohitJain所示的例子,你做了4+1/2,这是错误地给了你2。一种可能的解决方案是首先将i*i+1相乘,然后再除以2

关于绩效: 与输出相比,您是在线性时间内运行的——每个元素只进行一次迭代,没有什么可以做的,可能只有一些局部微优化

编辑:

新代码也有一个问题——当n==46341时,bizare边缘情况下,数组大小应该是1073720970,这在理论上是可能的。 但是,当与46341*46342相乘时,超出了范围,这将导致整数溢出和负大小数组

可以通过手动检查此案例来解决此问题。

如何

public static void main(String args[]) {

    int n =3;
    StringBuilder sb = new StringBuilder();
    String prei = "";
    for(int i=1;i<n+1;i++){
        prei    =prei + sb.append(i).toString();
    }

     char [] myArr = prei.toCharArray();
    }
}

首先调用show函数,然后调用converterintegers。

您的解决方案不起作用吗?如果是这样,让我们知道什么不起作用。如果你真的要求最好的解决方案,那是主观的,而不是本网站的重点。我的代码正在运行,我只是要求有低时间复杂度的解决方案。你的解决方案一般都很好。它在输出的大小上是线性的。除非你在寻找一些懒惰的列表评估,否则你没有什么真正的改进,除了一些微优化。如果你的解决方案有效,这里就不是发布这个问题的地方。对于你的问题,一个更好的地方是@Ruchi。是的,现在没事了。@amit。。OP编辑了那个部分。所以,你可以编辑你的答案来考虑任何其他问题,如果你看到。@ RohitJain:还有一个BISARE边缘案例的问题。编辑。@amit。。哦!我没想到那个案子。我会给你+1的奖励当n==46341时,也存在bizare边缘情况。详见我的答案。@nikdepen您对我的方法有何看法。检查我的答案。
List<Integer> myarrayList=new ArrayList<Integer>();
public void show(int n){
for(int i=1;i<n+1;i++){
    if(n==1){
        myarrayList.add(n);
        break;
    }
    if(n>1){
        for(int j=1;j<i+1;j++){
            myarrayList.add(j);
        }
    }

}
}

public  int[] convertIntegers(List<Integer> integers)
{
int[] ret = new int[integers.size()];
Iterator<Integer> iterator = integers.iterator();
for (int i = 0; i < ret.length; i++)
{
    ret[i] = iterator.next().intValue();
}
return ret;
}
}