我已经尝试解决以下编码难题的问题,但无法在1小时内完成。我对算法的工作原理有一个想法,但是我不确定如何最好地实现它。我下面有我的代码和问题。
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;
}
有人可以解决这个问题吗? 寻找编码方面的答案,因为我需要帮助以产生各种可能性
我认为没有必要建造一棵树,您应该能够随心所欲地进行计算-您只需要稍微延迟加法和减法即可正确考虑优先级:
static void check(double sum, double previous, String digits, double target, String expr) {
if (digits.length() == 0) {
if (sum + previous == target) {
System.out.println(expr + " = " + target);
}
} else {
for (int i = 1; i <= digits.length(); i++) {
double current = Double.parseDouble(digits.substring(0, i));
String remaining = digits.substring(i);
check(sum + previous, current, remaining, target, expr + " + " + current);
check(sum, previous * current, remaining, target, expr + " * " + current);
check(sum, previous / current, remaining, target, expr + " / " + current);
check(sum + previous, -current, remaining, target, expr + " - " + current);
}
}
}
static void f(String digits, double target) {
for (int i = 1; i <= digits.length(); i++) {
String current = digits.substring(0, i);
check(0, Double.parseDouble(current), digits.substring(i), target, current);
}
}
问题内容: 我有一个项目{a,b,c,d}的列表,当我需要生成所有可能的组合时, 您可以选择任意数量的项目 顺序不重要(ab = ba) 空集不被考虑 如果我们抓住可能性,那就应该是 我使用了以下递归方法: 当数组大时,有没有更有效的方法? 问题答案: 将组合视为一个二进制序列,如果所有4个都存在,则得到1111,如果缺少第一个字母,则得到0111,依此类推。对于n个字母,我们将得到2 ^ n -
问题内容: 给定未知数量的列表,每个列表的长度都未知,我需要生成一个包含所有可能唯一组合的单数列表。例如,给出以下列表: 然后,我应该能够生成12种组合: 如果添加了第三个元素列表,那么我将有36种组合,依此类推。 关于如何在Java中执行此操作的任何想法? (伪代码也可以) 问题答案: 你需要递归: 假设你的所有列表都在中,这是列表的列表。让是你所需要的排列的列表。你可以这样实现: 最终的呼叫将
问题内容: 我正在使用Python 2.7。 我有一个清单,我想要所有可能的有序组合。 这将给出以下输出: 但是我只希望输出是与列表相同顺序的组合。例如删除,,以及因为这些都不是正确的顺序相比列表。 我想通了用这个代替: 给我我想要的输出: 但是Python中是否有任何我想要的内置方法? 问题答案: 我相信您正在寻找的是原始列表中的所有可能 片段 。您所需的输出转换成切片是这样的: 因此,您应该尝
问题内容: 我知道通过使用Xeger,我们可以获得指定模式的随机值。 我想知道是否有一种方法可以返回指定正则表达式的所有有效字符串。例如,对于模式:,我们可以得到所有的值来。 谢谢 编辑: 在这里,我们不考虑+和*等无限输出;我们如何获得有限正则表达式的所有值? 最后编辑: 感谢大家!最后,我不会考虑所有可能的值,因为可能有数千个。我限制一个特定的数字作为减少数量的值的数量。 问题答案: 由于正则
问题内容: 这是问题: 给定Python中的项目列表,我将如何获得这些项目的所有可能组合? 这个站点上有几个类似的问题,建议使用itertools.combine,但是仅返回我需要的一部分: 如您所见,它仅按严格顺序返回项目,而不返回(2,1),(3,2),(3,1),(2、1、3),(3、1、2),( 2,3,1)和(3,2,1)。有一些解决方法吗?我似乎什么都没想。 问题答案: 用途: 帮助:
如果添加由3个元素组成的第三个列表,我将有36个组合,以此类推。 对于如何在Java中实现这一点有什么想法吗? (伪代码也可以)