我是新手 - 我有一个问题,我在采访中被问过,而且对于我的生活,我无法解决这个问题。我可以用while / for循环解决它,但是面试官明确要求不使用它我甚至与我的几个朋友讨论过但无法解决它。如果有人可以提供指示。
问题是: 对于给定的数组
s[] = {5,1,0,4,2,3}
示例长度(s,3) - a [3] = 4,a [4] = 2,a [2] = 0,a [0] = 5,a [5] = 3返回长度4。
对于给定条件写入子程序int length(s,3) - 查找找到给定值所需的步骤数 -
附加条件
答案 0 :(得分:1)
我想我找到答案最终没有我没有破解但是在网上发现:) ..这是解决方案
int length(int * s, int x){
if(s[x] < 0){
return -1;
}
else{
s[x] = -s[x];
int len = length(s, -s[x]);
s[x] = -s[x];
return len + 1;
}
}
答案 1 :(得分:1)
根本不修改数组的替代解决方案,但在x的前16位内隐藏了一个额外的参数:
ThrowInTernaryOperator
如果数组中的元素太多,这将失败,但我怀疑任何其他递归解决方案都可能在任何情况下都达到堆栈溢出。
答案 2 :(得分:-1)
我不认为这与你的任何条件相矛盾。我只是没有使用数组作为参数(实际上不是问题,你可以自己修改)
int s[] = {5,1,0,4,2,3};
bool col[100]; ///to check cycle
int rec(int n)
{
if(col[n])return 0;
col[n]=true;
int sum=0;
sum = 1+rec(s[n]);
return sum;
}
答案 3 :(得分:-1)
面试官正在探索你对算法和编程范式的理解,试图了解你的训练,背景和深度。面试官有一个挑战性的任务;通过最少的证据来识别有能力的开发人员。因此,访问者提出了一个构造的问题(他们希望)引出所需的知识(候选人X是否知道如何解决问题Y,或者理解概念Z)也许是因为面试官认为期望的答案表明候选人知道预期的知识体系。
现代语言提供了几种重复结构(命令,语句),一些预先测试(在进入语句块之前检查条件),一些是后测试(在执行语句块后至少检查一次条件)。以下是示例,
预测试
while(condition) statement-block
for(initializer;condition;step) statement-block
后测试
do statement-block while(condition)
repeat statement-block until(condition)
do statement-block until(condition)
这些都可以写成带有分支(goto),
的条件(选择)结构预测试
label:
if(condition)
statement-block;
goto label;
else
nil;
endif
后测试
label:
statement-block;
if(condition)
goto label;
endif
你也可以使用递归,只要条件成立,你就可以调用相同的函数(或者直到满足条件,取决于正逻辑或负逻辑),
预测试
function recurse(args)
if(condition)
statement-block
recurse(revised args);
endif
return
end #function
后测试
function recurse(args)
statement-block
if(condition)
recurse(revised args);
endif
return;
end
您将学习算法中的递归,或者可能是可计算性课程。您将学习编译器,高性能计算或系统类中的条件分支。您的编译器课程可能会检查检测&#39;尾递归的技术,以及如何将函数调用重写为循环。
这是问题,重申,
given array, s[] = {5,1,0,4,2,3}
array length unknown
content between [0 .. length], not repeated, no duplicates
write subroutine which provides the number of steps to find given value
即,
int length( array s, int member ) --> position
检查问题的条件(约束),
这里有两个解决方案和一个测试驱动程序(注意,我将它们命名为lengthi,iterative和lengthr,递归)。
#include <stdio.h>
/* conditional branch */
int lengthi( int s[], int member )
{
int position=0;
AGAIN:
if( s[position] == member ) return(position);
++position;
goto AGAIN;
return(-1);
}
/* recursive */
int lengthr( int s[], int member )
{
if( s[0] == member ) return(0);
return( 1+length(s+1,member) );
}
int
main(int argc,char* argv[])
{
int s1[] = {0,1,2,3,4,5,6,7,8,9};
int s2[] = {1,2,3,4,9,8,7,6,0,5};
int s3[] = {2,4,6,8,0,1,3,5,7,9};
printf("%d at %d\n",3,lengthr(s1,3));
printf("%d at %d\n",3,lengthr(s2,3));
printf("%d at %d\n",3,lengthr(s3,3));
printf("%d at %d\n",3,lengthi(s1,3));
printf("%d at %d\n",3,lengthi(s2,3));
printf("%d at %d\n",3,lengthi(s3,3));
}
因为我们应该找到步数(迭代,函数调用),即要求列表中的序数位置,而不是C索引(从零开始)位置。
这是一个面试问题,而不是编程问题(本身),所以可能更适合Programmers.stackexchange网站。 我可能会给面试官一个有趣的答案或他们想要的答案。