【问题标题】:Array method that returns a new array where every number is replicated by “itself” # of times返回一个新数组的数组方法,其中每个数字都被“自身”复制 # 次
【发布时间】:2014-12-27 07:14:41
【问题描述】:

我正在尝试在 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;
}

【问题讨论】:

  • "我的程序不会编译" 那么告诉我们编译器错误是什么。
  • 它说“newNums 无法解析为变量”
  • 你的程序有很多我现在可以看到的缺陷。拿着一张纸坐下来,一步一步地完成这个过程。首先,看看您初始化新 int 数组的方式。你给我们的例子有什么意义吗?
  • 想象一下如果 nums 的长度为 0 会发生什么。你的第一个 for 循环永远不会进入,newNums 永远不会被创建,你的 return 语句试图返回一些不存在。

标签: java arrays multiplicity


【解决方案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

【讨论】:

  • "for (int num : nums)" 中的冒号有什么作用?
  • @AlN。这是for-each 循环。您可以像 nums 中的每个 num 一样阅读它。或者您可以改用for (int t = 0; t &lt; nums.length; t++) { int num = nums[t]; /* ... */ } 之类的东西。我更喜欢for-each
【解决方案2】:

一旦你初始化了你的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;
}

【讨论】:

    【解决方案3】:

    在探索整个输入数组之前,您无法知道新数组的大小。 所以你可以

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

    填充数组的示例(检查他的大小是否正确)

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-29
      • 1970-01-01
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 1970-01-01
      • 2021-03-05
      相关资源
      最近更新 更多