甲骨文面试中问的问题。例如,如果我输入的是6,则

  • 5 + 1 = 6 Ans:2
  • 4 + 2 = 6 Ans:2
  • 3 + 2 + 1 = 6 Ans:3

  • 因此,最终答案应为3。(即,需要3,2,1才能得出总和6)

    注意:不允许重复数字(即1 + 1 + 1 + 1 + 1 + 1 = 6)

    我使用递归解决了问题,但面试官并不满意。动态编程可行吗?

    最佳答案

    我正要发布答案,但@Cruise Liu击败了我。虐待尝试解释一下。
    它是整数分区的一种类型,但是您不需要生成元素,因为您仅对“元素数”感兴趣。即最终答案3,而不是{1,2,3}

    给定数字N,您还有另一个限制,即数字不能重复。
    因此,最好的情况是N实际上是一个数字,例如1、3、6、10、15

    i.e. f(x) = x * (x + 1) / 2.
    

    例如,取6。f(x)= 6存在。特别是f(3)= 6。这样就得到了答案3。

    这意味着,如果对于f(x)= N,存在一个整数X,则存在一组数字1,2,3 ... x,它们相加后得出N。这是最大数可能的(没有重新定位)。

    但是,在f(x)= N的情况下,x不是整数。
    f(x) = x * (x + 1 ) / 2 = N
    i.e. x**2 + x = 2*N
    x**2 + x - 2*N = 0
    

    解决这个二次方程式,我们得到

    由于x不是负数,所以我们不能

    所以我们留下了

    对于N = 6

    完美的整数。但是对于N = 12

    这是8.845/2这是一个分数。底值是4,这就是答案。

    简而言之:实现一个功能
    f(N)=(整数)((-1.0 + sqrt(1 + 8 * N))/2.0)

    IE。
    int max_partition_length(int n){
        return (int)((-1.0 + sqrt(1 + n*8))/2);
    }
    

    关于c - 给定n,求出获得n的最大数量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21656650/

    10-10 14:56