私は凝った IDE と C# を使ってきたので、頭の体操の質問に慣れてきました。この質問に対する解決策はありますが、私の本当の質問は、配列サイズをどのように処理すればよいですか? リストを使用できないと仮定します。これは C# で書かれています。
配列のサイズが小さすぎるか、現在の状態では単にメモリを浪費している可能性があります。アルゴリズムに集中できるように、ネガティブ コインなどのチェックは省略しました。だから私はこの行を取り除きたい:double [] minList = new double[1000];
インタビューの質問は次のとおりです。合計が値になるコインの最小数を返します (不可能な場合は -1:
public static Main(string [] args) {
double[] coins = {0.01, 0.05, 0.10, 0.25};
Console.WriteLine(MinNumberOfCoinsToSum(0.24, coins));
}
public static int MinNumberOfCoinsToSum(double sum, double [] coins)
{
double [] minList = new double[1000];
minList[0] = sum;
for (int i = 1; i < minList.Length; i++)
{
double buffer = minList[i-1];
for (int j = 0; j < coins.Length; j++)
{
if(minList[i-1] - coins[j] >= 0.0)
{
buffer = Math.Min(buffer, minList[i-1] - coins[j]);
}
}
minList[i] = Math.Min(minList[i-1], Math.Round(buffer, 2));
if (minList[i] == 0.0)
{
return i;
}
}
return -1;
}
さて、あなたが言ったことを取り入れた答えは次のとおりです(ただし、見つからない場合は-1は返されません):
private static int MinNumberOfCoinsToSumRecursiveDecimalVersion(decimal sum, decimal [] coins)
{
decimal buffer = sum;
for(int i = 0; i < coins.Length; i++)
{
if(sum - coins[i] >= 0)
{
buffer = Math.Min(buffer, sum - coins[i]);
}
}
if (buffer == sum && sum == 0m)
return 0;
if(buffer == sum && sum != 0m)
{
return Int32.MinValue;
}
int result = 1 + MinNumberOfCoinsToSumRecursiveDecimalVersion(Math.Min(buffer, sum), coins);
return result;
}
しかし、私の本当の問題は、事前にサイズがわからない場合に配列サイズをどのように処理するかです。ところで、10 進数のメモをありがとう... インタビューで恥ずかしかっただろう.
public int MinNumberForCoinSum(int sum, decimal [] coins) {
// I assume there is a custom Util class, but it would be checking null, empty, or any other business requirement
foreach(var verification in VerificationUtil.GetArrayVerifications()) {
verification.Verify(coins);
}
if(sum < 0 ) { Throw new InvalidArgumentException()); }
return MinNumberOfCoinsToSumRecursiveDecimalVersion(sum, coins);
}