查找找到索引

时间:2015-11-24 17:56:37

标签: c arrays algorithm

我是新手 - 我有一个问题,我在采访中被问过,而且对于我的生活,我无法解决这个问题。我可以用while / for循环解决它,但是面试官明确要求不使用它我甚至与我的几个朋友讨论过但无法解决它。如果有人可以提供指示。

问题是: 对于给定的数组

s[] = {5,1,0,4,2,3}
  1. 未给出数组的长度。
  2. 如果数组的长度是5个内容 保证在0到5之间。
  3. 没有重复 号。
  4. 示例长度(s,3) - a [3] = 4,a [4] = 2,a [2] = 0,a [0] = 5,a [5] = 3返回长度4。

    对于给定条件写入子程序int length(s,3) - 查找找到给定值所需的步骤数 -

    附加条件

    1. 您不能使用任何循环语句,例如for,while等等 -
    2. 您不能使用任何全局或静态变量。
    3. 您无法在此例程中调用其他例程
    4. 您不能修改给定的函数参数 - 它只保留长度(s,n)
    5. 您也无法更改原始数组

4 个答案:

答案 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

检查问题的条件(约束),

  • 数组长度未知 - 解决方案必须适用于可变输入范围
  • 不能使用循环语句(for,while等) - 这表明访谈者想要条件分支或递归。
  • 无法使用全局变量或静态变量 - 这是否表明访谈者想要一个递归/函数式编程解决方案? Conditional-branch也提供了这个。
  • 无法调用此例程中的其他例程 - 面试官是指除相同功能以外的功能,还是调用任何功能(面试官的意思是&#39;其他&#39;)。
  • 无法修改函数参数,保持长度(s,n) - 允许声明本地(堆栈)变量。这可能意味着按值传递,制作本地副本等。但不是破坏性修改。
  • 无法更改原始数组 - 绝对没有破坏性修改。可能的提示&#39; (确定要制作本地副本吗?),或者进一步表明你应该使用条件分支?

这里有两个解决方案和一个测试驱动程序(注意,我将它们命名为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网站。 我可能会给面试官一个有趣的答案或他们想要的答案。