Java每日编码问题#002

daily Coding Problem is a website which will send you a programming challenge to your inbox every day. I want to show beginners how to solve some of these problems using Java, so this will be an ongoing series of my solutions. Feel free to pick them apart in the comments!

Problem

给定一个整数数组,返回一个新数组,使索引处的每个元素一世 of the new array 一世s the product of all the numbers 一世n the or一世g一世nal array except the one at 一世。For example, 一世f our 一世nput was [1、2、3、4、5],预期输出为[120、60、40、30、24]。 If our 一世nput was [3,2,1],预期输出为[2,3,6]。Follow-up: what 一世f you can't use d一世v一世s一世on?

Strategy

剧透!除非您想查看我的解决方案,否则请不要在下面查看!


在最坏的情况下,返回的长度数组的每个元素ñ将是ñ-1其他数字,所以这将是O(ñ2)解。

相反,如果我们首先乘以给定排列在一起(上)),然后针对返回数组的每个元素,将乘积除以该索引中该索引处的元素给定数组,我们有一个上) + 上) = 上)解。

Code

最简单的方法是先将所有数组元素相乘,然后除以索引处的元素一世 to get the element at 一世ndex 一世返回的数组:

  public static int[] codingProblem002 (int[] given) {

    int product = 1;

    for (int element : given) 
      product *= element;

    final int len = given.length;
    int[] retval = new int[len];

    for (int i = 0; i < len; ++i)
      retval[i] = product / given[i];

    return retval;
  }

此解决方案要求ñ乘法ñ除法,并且至少遍历长度为3的基本数组ñ。 我们可以稍微重新排列解决方案,并初始化返回数组给定计算数组时产品:

  public static int[] codingProblem002 (int[] given) {

    int product = 1;
    final int len = given.length;
    int[] retval = new int[len];

    for (int element : given) {
      product *= element;
      retval[i] = element;
    }

    for (int i = 0; i < len; ++i) 
      retval[i] = product / retval[i];

    return retval;
  }

但这仍然需要走给定第一个数组对于循环以及直肠的数组,然后走撤回在第二个数组中再次对于环。 我发现自己现在真的想要Java中的指针。


要解决此问题而不使用除法,我们可以遍历给定数组ñ t一世mes, mult一世ply一世ng each element 一世n the returned数组(except the 一世-第一个)一世的第th个元素给定数组:

  public static int[] codingProblem002 (int[] given) {

    final int len = given.length;
    int[] retval = new int[len];

    // initialise all elements of `retval` to 1
    Arrays.fill(retval, 1);

    for (int i = 0; i < len; ++i) {
      for (int j = 0; j < len; ++j) {
        if (j == i) continue;
        retval[j] *= given[i];
      }
    }

    return retval;
  }

这是个上2)解。

我对这里的解决方案不是很满意,如果有人可以展示出更高效的方式来完成此编码挑战,我会非常喜欢!


All the code for my Daily Coding Problems solutions is available at github.com/awwsmm/daily.

有什么建议吗? 在评论中让我知道。

from: https://dev.to//awwsmm/java-daily-coding-problem-002-56j0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值