2014-10-31 65 views
0

我想在Java中编写一个接收数组并返回一个新的数组,其中每个数字都打印该次数的方法。这里是一个输入和输出的例子:“1 2 3 0 4 3”--->“1 2 2 3 3 3 4 4 4 4 3 3 3”。我卡住了,我的程序不能编译。有没有人看到我要去哪里错了?数组方法返回一个新的数组,其中每个数字都被“自身”复制#次数

public static int [] multiplicity(int [] nums) { 
    for (int i = 0 ; i < nums.length ; i++) { 
     int size = nums.length + 1; 
     int newNums[] = new int [size]; 
     for (int j = 0 ; j < nums.length ; j++) { 
      int value = nums[j]; 
      for (int v = 0 ; v < value ; v++) { 
       newNums[j + v] = value; 
      } 
     } 
    } 
    return newNums; 
} 
+0

“_My程序不会compile_”那么告诉我们的编译器错误是什么。 – csmckelvey 2014-10-31 02:33:39

+0

它说“newNums不能解析为变量” – Bill 2014-10-31 02:34:34

+1

你的程序有很多我现在可以看到的缺陷。坐下来一张纸,一步一步地完成。首先,看看你初始化新的int数组的方式。你给我们的例子有没有意义? – 2014-10-31 02:34:40

回答

1

您当前的代码不大小的新数组正确,你可以治好你的编译器错误足以轻松地像

int size=nums.length+1; 
int newNums [] = new int [size]; 
for (int i=0; i<nums.length; i++) 
{ 
    // int size=nums.length+1; 
    // int newNums [] = new int [size]; 

但是,这显然赢得不允许你填充所有的值。相反(假设您不能使用动态数据类型,如Collection),您需要迭代数组一次以获取元素的最终数量,然后填充数组。喜欢的东西,

public static int[] multiplicity(int[] nums) { 
    // first pass 
    int count = 0; 
    for (int num : nums) { 
     for (int i = 0; i < num; i++) { 
      count++; 
     } 
    } 
    int[] ret = new int[count]; 
    count = 0; 
    // second pass 
    for (int num : nums) { 
     for (int i = 0; i < num; i++) { 
      ret[count++] = num; 
     } 
    } 
    return ret; 
} 

然后,你可以测试它喜欢,

public static void main(String arg[]) { 
    int[] in = { 1, 2, 3, 0, 4, 3 }; 
    int[] out = multiplicity(in); 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < out.length; i++) { 
     if (i != 0) { 
      sb.append(' '); 
     } 
     sb.append(out[i]); 
    } 
    String expected = "1 2 2 3 3 3 4 4 4 4 3 3 3"; 
    System.out.println(expected.equals(sb.toString())); 
} 

输出是

true 
+0

“for(int num:nums)”中的冒号是做什么的? – Bill 2014-10-31 02:53:27

+0

@AlN。它是['for-each'](http://docs.oracle.com/javase/1.5.0/docs/guide/language/foreach.html)循环。你可以在'nums'中读取每个'num'。或者你可以用'for(int t = 0; t 2014-10-31 02:55:12

0

一旦你初始化你的int[] newNums,你不能动态调整它的大小。再次初始化将丢弃先前的数组。

这里是另一种方式来解决这个问题:

public static int [] multiplicity (int [ ] nums) 
{ 
    // create a list to contain the output 
    List<Integer> newNums = new ArrayList<Integer>(); 

    // for each incoming int 
    if(nums != null) { 
     for (final int i : nums) 
     { 
      // repeat adding the value 
      for(int j = 0; j < i; j++) { 
       newNums.add(i); 
      } 
     } 
    } 

    // now copy from the List<Integer> to the result int[] 
    int[] result = new int[newNums.size()]; 
    for(int i=0; i < newNums.size(); i++) { 
     result[i] = newNums.get(i); 
    } 

    // return the result 
    return result; 
} 
0

你可以不知道新的数组大小,直到你探索整个输入数组。 所以你可以

  • 探索整个数组并计算长度,然后重新探索输入数组并填充新的。你只需要1个内存分配(只有1个新的int [])
  • 创建一个向量并填充它。然后使用.toarray方法

为例,填补了数组(检查他的权利的大小)

int k = 0 
for(int i: nums) { 
    for(int j = 0; j < i; j++) { 
     newArray[k] = i; 
     k++; 
    } 
} 
相关问题