我正在尝试用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 :(得分: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
答案 1 :(得分: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;
}
答案 2 :(得分:0)
在浏览整个输入数组之前,您无法知道新的数组大小。 所以你可以
例如填充数组(检查他的大小是否合适)
int k = 0
for(int i: nums) {
for(int j = 0; j < i; j++) {
newArray[k] = i;
k++;
}
}