硬币变化问题是流行的编码面试问题之一,知道如何解决这个问题可以在编码面试中帮助你。学习一些技巧和数据结构也很有用。这个问题多少与数组有关,所以我们将讨论什么是数组,但在我们深入研究之前,我们需要了解这个问题。我们要解决的是一个硬币问题,即确定一个金额有多少种可能的支付方式。假设,玛丽是一位经营硬币兑换的女商人。
因此,一个顾客来换取一个特定数量的硬币。那么,以玛丽所拥有的硬币,她可以有多少种可能的方式来兑换顾客的硬币。如果玛丽有以下硬币1,2,3,4,5,顾客想换16个。玛丽可能的换币方式有。
Example 1 :
Input: [1,2,3,4,5]
Sum: 16
Output: 4
Explanation: Four coins require to make the desired sum which is [5,5,5,1]
Example 2:
input: [2, 4, 6, 8]
Sum: 15
Output: -1
Explanation: There is no combination present with sum 15.
Example 3:
Input: [1,2,5,9,8]
Sum: 17
Output: 2
解释:需要两枚硬币来组成所需的总和,即[9,8]。
在这种方法中,我们可以使用递归来解决这个问题,因为我们必须遍历所有可能的硬币组合,每次都要更新产生这个总和所需的最小硬币数量。
所以,这样做的目的是为了让你对这个问题有一个背景了解。所以我希望这对你有帮助
如何在Java中解决换币问题
现在让我们看看代码的实现。
public class Main
{
public static int count(int\[\] coins, int number, int target)
{
if (target \== 0) {
return 1;
}
if (target < 0 || number< 0) {
return 0;
}
int first\= count(coins, number, target \- coins\[number\]);
int second\= count(coins, number \- 1, target);
return first + second;
}
public static void main(String\[\] args)
{
int\[\] coinArray \= { 1, 2, 3 };
int target \= 4;
System.out.print("The total number of ways to get the desired change is "+ count(coinArray, coinArray.length \- 1, target));
}
}
为了解释下面的代码实现,我们在第3行有一个名为count() 的方法,它接收了3个参数,首先是一个int类型的硬币数组,其次是一个int类型的数字,以及一个it类型的目标。 (目标是我们正在寻找的特定数字)。
第4行的第一个条件是,如果目标是0,那么应该返回1。 所以程序从这里结束,但如果不是,它就会进入下一行并检查第8行的条件,即如果目标数小于0或数字小于0,就应该返回0。
但是如果第一个和第二个条件是假的,那么它就会转到第11行并从那里开始执行。这是一个递归调用,一个方法在自身中调用自己。
因此,该方法被调用了两次,并存储在两个不同的变量中,分别命名为first和second。因此,第一个方法调用的第一个参数是硬币阵列,第二个参数是数字,第三个参数是目标减去数字处的硬币阵列,即coin[number]。
对于第二个方法的调用,它分别输入了硬币、数组、数字-1和目标,并在第13行返回了第一个和第二个的总和。
第16行是主方法。在第18行,一个硬币数组被创建,并以数字初始化。
第19行是目标变量,类型为int,初始化为4
第20行打印出方法调用的输出,它是适当的参数。硬币数组,其长度-1,以及目标。
数组如何工作
数组 是具有相同价值的元素的集合。这意味着,你不能在那里找到不同种类的元素或数据类型。你可以看到上面我们只有一个整数的数组,它们是数字。 在java中,当你新创建一个数组时,你必须做两件重要的事情。
图1.0 数字数组
首先,你必须说明进来的元素的类型。是整数、字符串还是布尔值等等。好消息是,一旦你指定了即将到来的数据类型,你就不能做其他的事情。你不能声明一个int数组,然后现在用一个字符串元素来填充它,不!,它不能这样工作。这将导致一个编译错误。
第二,在java中声明一个数组时,你必须说明它的长度。而且这一点也不能改变。下面是如何声明一个数组的。
int [] numbers= new int [10];
结语
在这篇文章中,你学到了如何解决一个硬币的变化问题。另外,请记住,任何试图在一个特定的数组中添加超过你所指定的内容的行为都会导致一个数组索引越界的异常。你不能说创建时进来的项目的长度是10,而最终,你放了11个项目,对不起,这是不可能的!
感谢你到目前为止阅读这篇文章。如果你喜欢这个关于寻找硬币变化的基于数组的编码面试问题以及我的解决方案和解释,那么请与你的朋友和同事分享。如果你有任何问题或反馈,请给我留言。
![[Solved] How to solve a coin change problem in Java? Dynamic Programming Example](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghJUnVsBYvNOZVG0BO9wNX_Ghb3NzYbGVttRoaQg0DmSNBEQw47QuU21Yc62m1l6-x4HbJy24sAmZrGe9AzJ0M_d5pHVY8_zjz5mwL9j5CVrH8UzPl0RRy_vUfuZ-3lA6tONY20b_0DSDcbr2-fYrlf2AKtKE84HYnO65TBHFBFSnPaY3nCOTwX73e/w580-h221/coloArr.png)