我曾经尝试在编程挑战中解决以下问题,但是在一小时内没有完成。我对算法的工作原理有一个想法,但是我不确定如何最好地实现它。下面是我的代码和问题。
pi的前12位数字为314159265358。 我们可以将这些数字组成一个表达式,计算出27182(e的前5位数字),方法如下:
3141 * 5 / 9 * 26 / 5 * 3 - 5 * 8 = 27182
或者3 + 1 - 415 * 92 + 65358 = 27182
注意输入数字的顺序不会改变,运算符(+、-、/ 或 *)只是简单地插入以创建表达式。
编写一个函数,接受数字列表和目标值,返回这些数字可以组成的所有表达式的方法,这些表达式求值为目标值。
例如:
f("314159265358", 27182) 应该打印:
3 + 1 - 415 * 92 + 65358 = 27182
3 * 1 + 4 * 159 + 26535 + 8 = 27182
3 / 1 + 4 * 159 + 26535 + 8 = 27182
3 * 14 * 15 + 9 + 26535 + 8 = 27182
3141 * 5 / 9 * 26 / 5 * 3 - 5 * 8 = 27182
这个问题很难,因为你可以有任意数字组合,并且不是一次考虑一个数字。我不确定如何进行组合和递归步骤。请注意,解决方案中没有提供括号,但操作顺序是保留的。我的目标是从某个数字开始。
{"3"}
then
{"31", "3+1", "3-1", "3*1" "3/1"}
then
{"314", "31+4", "3+1+4", "3-1-4", "31/4", "31*4", "31-4"} etc.
然后每次查看列表中的每个值,看它是否是目标值。如果是,将该字符串添加到结果列表中。
这是我的代码
public static List<String> combinations(String nums, int target)
{
List<String> tempResultList = new ArrayList<String>();
List<String> realResultList = new ArrayList<String>();
String originalNum = Character.toString(nums.charAt(0));
for (int i = 0; i < nums.length(); i++)
{
if (i > 0)
{
originalNum += nums.charAt(i); //start off with a new number to decompose
}
tempResultList.add(originalNum);
char[] originalNumCharArray = originalNum.toCharArray();
for (int j = 0; j < originalNumCharArray.length; j++)
{
//go through every character to find the combinations?
// maybe recursion here instead of iterative would be easier...
}
for (String s : tempResultList)
{
//try to evaluate
int temp = 0;
if (s.contains("*") || s.contains("/") || s.contains("+") || s.contains("-"))
{
//evaluate expression
} else {
//just a number
}
if (temp == target)
{
realResultList.add(s);
}
}
tempResultList.clear();
}
return realResultList;
}
有人可以帮忙解决这个问题吗?希望回答中包含代码,因为我需要在生成可能性方面得到帮助。
314159265358
,因此有11个位置可以插入空格(将数字连接成更大的数字)或4个运算符之一。在这些5个选择的11个位置上排列组合将生成所有可能性。 - m69 ''snarky and unwelcoming''3 + 1 * 4 * 159 + 26535 + 8 = 27182
和3141 / 5 / 9 * 26 * 5 * 3 - 5 * 8 = 27182
。 - m69 ''snarky and unwelcoming''