给定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;
}
什么是最好的解决方案?
答案 0 :(得分: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;
}
此解决方案通过常数倍更好。如果你正在寻找Big-Oh,他们都是O(i ^ 2)并且不可能做得更好。
如果您需要证明为什么不可能做得更好。首先证明返回数组的大小是((i)*(i + 1))/ 2)。然后创建必须填充数组中每个位置的参数。如果你做得比O(i ^ 2)好,你还没有填充数组中的每个位置。
答案 1 :(得分:1)
由于整数算术,您的代码甚至无法输入。
对于@RohitJain显示的示例,你执行了(4+1)/2
,这是错误地给你2.可能的解决方案是首先乘以i*(i+1)
,然后再乘以2。
关于表现:
与输出相比,你在线性时间内运行 - 每个元素只需一次迭代,没有什么可以做的,也许只有一些局部的微观优化。
修改强>
新代码也存在一个问题 - n== 46341
时的奇特边缘情况,数组大小应为1073720970,理论上可能是(AFAIK)。
但是,当乘以46341 * 46342时,会超出范围,从而导致整数溢出 - 以及负数大小的数组。
这可以通过手动检查这种情况来解决。
答案 2 :(得分:0)
O(n^2)
时间 - 更确切地说,它需要(n)(n+1)/2
时间。但是,由于这也是数组的大小,因此无法做得更好。
答案 3 :(得分:0)
你的for循环很好,这种类型的列表的效率有限,但你的代码可以清理一下。 var1
有点无用,var2
仅在i
为奇数时才有用(否则它不准确),var3
绝对没有任何功能。数组的长度将是1到i
或Σi
或int arr_length = i*(i+1)/2
的总和。您甚至可以将该求和放在数组声明中,以便更容易理解。
答案 4 :(得分:0)
这个怎么样。
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();
}
}
答案 5 :(得分:0)
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;
}
}
首先调用show function然后convertIntegers 。