我在一个访谈网站上遇到了这个问题 - 我们给了4个数字说n1,n2,n3,n4.我们可以按任意顺序放置它们,我们可以在它们之间使用数学运算符+, - ,*,/来得到最终结果为24.为此编写一个算法 - 它将需要4个数字并返回false或true结果24可以任意组合.可以多次使用相同的运算符.
其中一种方法是 -
这种解决方案是强力的,不是最佳解决方案.我认为使用二叉搜索树可能有更好的解决方案.
可能重复:
创建具有特定位数的多个数字
我正在尝试编写一些代码,通过将位移位来将每个可能的数字组合放在一个数组中.
例如,我想找到数组应该包含的3位(最大数字可以是6)的所有可能组合:
000111 001011 001101 001110 010011 010101 010110 011001 011010 011100 100011
等等...
根据我的解释,当最后一个位置为1时,我们将数字移1(x >> 1)并在开始时加1.但是,我不确定如何编写其余的代码.我用C来写这个.
另外 - 据我所知,这是一个colex序列,但是,如果有另一个序列可以给我相同的最终结果(具有约束为N的k位的所有可能组合的数组),我都是耳朵. .
我正在准备采访,我正在努力记住Heap的算法:
procedure generate(n : integer, A : array of any):
if n = 1 then
output(A)
else
for i := 0; i < n; i += 1 do
generate(n - 1, A)
if n is even then
swap(A[i], A[n-1])
else
swap(A[0], A[n-1])
end if
end for
end if
Run Code Online (Sandbox Code Playgroud)
该算法非常着名,可以生成排列.它简洁快速,与代码密切配合,生成组合.
问题是:我不喜欢记住事情,我总是试图让概念在以后"推断"算法.
这个算法真的不直观,我找不到解释它如何对我自己起作用的方法.
有人可以告诉我为什么以及如何在生成排列时该算法按预期工作?
我最近为F#项目编写了以下组合和排列函数,但我很清楚它们远未优化.
/// Rotates a list by one place forward.
let rotate lst =
List.tail lst @ [List.head lst]
/// Gets all rotations of a list.
let getRotations lst =
let rec getAll lst i = if i = 0 then [] else lst :: (getAll (rotate lst) (i - 1))
getAll lst (List.length lst)
/// Gets all permutations (without repetition) of specified length from a list.
let rec getPerms n lst =
match n, lst with
| 0, _ -> …Run Code Online (Sandbox Code Playgroud) 这是打印字符串字符排列的标准函数:
void permute(char *a, int i, int n)
{
int j;
if (i == n)
printf("%s\n", a);
else
{
for (j = i; j < n; j++) //check till end of string
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j)); //backtrack
}
}
}
void swap (char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
Run Code Online (Sandbox Code Playgroud)
它工作正常,但有一个问题,它还打印一些重复的排列,exapmle:
如果字符串是"AAB"
输出是:
AAB
ABA
AAB
ABA
BAA
BAA
Run Code Online (Sandbox Code Playgroud)
这也有3个重复的条目.
有没有办法防止这种情况发生?
-
谢谢
Alok Kr.
经典的Fisher Yates看起来像这样:
void shuffle1(std::vector<int>& vec)
{
int n = vec.size();
for (int i = n - 1; i > 0; --i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
昨天,我错误地"向后"实现了迭代:
void shuffle2(std::vector<int>& vec)
{
int n = vec.size();
for (int i = 1; i < n; ++i)
{
std::swap(vec[i], vec[rand() % (i + 1)]);
}
}
Run Code Online (Sandbox Code Playgroud)
这个版本是否比第一个版本更糟(或更好)?它是否会扭曲由此产生的概率?
我有一个问题,我无法在网上的任何地方找到它(它可能在那里,但我找不到它,嘿).
我有一个包含13列数据的电子表格.每列都包含需要进入整个测试用例的参数变体.
所有这些都不一样,比如
E:
101%
105%
110%
120%
J:
Upper S
Upside L
Downside B
Premium V.
我已经看到了使用嵌套循环的组合问题的几种解决方案.我想避开13个嵌套循环(但这是我目前最好的选择).我对如何在每列中生成每个独特组合感到茫然.
我不确定这对你们是否足够有意义.我希望有人能够通过递归算法至少指出我正确的方向.我想让它足够动态,可以使用不同数量的列和行.
感谢你们给我的任何帮助.
我已经根据分数计算了一次计算.
例如,如果分数当前为140,则该类返回一个包含可能抛出的集合的数组:
[10] => Array
(
[0] => T18
[1] => T18
[2] => D16
)
[11] => Array
(
[0] => T18
[1] => T16
[2] => D19
)
[13] => Array
(
[0] => T17
[1] => T17
[2] => D19
)
[14] => Array
(
[0] => 50
[1] => 50
[2] => D20
Run Code Online (Sandbox Code Playgroud)
但计算这样的事情是相当缓慢的.有什么方法可以优化这个课程吗?
<?php
/**
* PHP Dartgame calculating class
* @author Youri van den Bogert
*/
class Darts {
/**
* @var string
*/ …Run Code Online (Sandbox Code Playgroud) 我正在研究一个程序,我有一个函数可以交换用户输入的长度数组中的位置.但是,我想弄清楚如何打印出这个函数调用N!times,列出函数中的所有排列.
我的置换函数代码是:
static void nextPerm(int[] A){
for( int i = (n-1); i > 0; i-- ){
if( A[i] < A[i+1] ){
A[i] = pivot;
continue;
}
if( A[i] >= A[i+1] ){
reverseArray(A);
return;
}
}
for( int i = n; i > 0; i--){
if( A[i] > pivot ){
A[i] = successor;
continue;
}
}
Swap(pivot, successor);
int[] B = new int[pivot+1];
reverseArray(B);
return;
}
Run Code Online (Sandbox Code Playgroud)
我应该在函数main中编写一个循环,这将打印出来!次?
我是一名木工,试图在这里寻求一些数学和算法帮助.
我正在尝试制作28套七巧板来送亲人,像这样:
DanielHolth + RobotE at nl:Wp [CC BY-SA 3.0(http://creativecommons.org/licenses/by-sa/3.0/)],来自Wikimedia Commons
玩具由7块木板组成,应涂成各种颜色.为了使绘画更容易,我认为最好的方法是将它们分批涂成4组,然后混合它们.
我已经标记了第1-7段,以便更容易讨论:
什么是最有效的混合方式,所以我没有得到相同的颜色组合?我希望礼物尽可能个性化,颜色组合是实现这一目标的好方法.
编辑:每组拼图由七个不同颜色的拼图组成.
permutation ×10
algorithm ×7
combinations ×3
c ×2
c++ ×2
arrays ×1
class ×1
excel ×1
excel-vba ×1
f# ×1
factorial ×1
java ×1
php ×1
probability ×1
pseudocode ×1
shuffle ×1
vba ×1