拼多多笔试1,3题分享

拼多多笔试分享(c++)版本.
1 求n个数中方差最小的三个数.
解题思路:排序然后遍历一次即可
// first problem
double std3(int a,int b,int c){
    double mean = double(a+b+c) /3;
    double ret = (a-mean)*(a-mean) +(b-mean)*(b-mean)+(c-mean)*(c-mean);
    return ret;
}
double minstd(int num, int*numbers){
  sort(numbers,numbers+num);
  double ret = std3(numbers[0],numbers[1],numbers[2]),temp;
  for(int i=1; i<num-2;i++){
      temp = std3(numbers[i],numbers[i+1],numbers[i+2]);
      if (temp<ret)
        ret = temp;
  }
  return ret;
}

3 求单调递增序列且和等于n的个数.
解题思路:第一种暴力搜索dfs,ret 即返回值,通过率5%.
//third problem: 求递增且和邓素numsum 的序列个数;
void dfs(int numlen,int cur,int numSum,int &ret,int* nums){
    if(numSum<0 )
        return;
    if(cur == numlen){
        if (numSum ==0)
            ret +=1;
        return;
    }
    if(cur ==0){
        for(int i=1;i<=int((numSum)/numlen);i++){
            nums[0] = i;
            dfs(numlen,cur+1,numSum-i,ret,nums);
        }
    }
    else{
        for(int i=nums[cur-1]+1;i<=int(numSum/(numlen-cur));i++){
            nums[cur] = i;
            dfs(numlen,cur+1,numSum-i,ret,nums);
        }
    }
   return;
}
第二种:动态规划,保留上次的结果.
int count_sequences_satisfy_condition(int numlen, int numSum,unsigned long int** visited ){
    if(numlen==1)
        return 1;
    if(2*numSum<numlen*(numlen-1))
        return 0;
    if(numlen == 2){
        visited[numSum][2] = (numSum-1)/2;
        return (numSum-1)/2;
    }
    if(visited[numSum][numlen])
        return visited[numSum][numlen];
    int firstNumMax = numSum/numlen; 
    int sumcount = 0;
    for(int i=1;i<=firstNumMax;i++){
        visited[numSum-numlen*i][numlen-1] = count_sequences_satisfy_condition(numlen-1,numSum-numlen*i,visited);
        sumcount += visited[numSum-numlen*i][numlen-1];
    }
    return sumcount;
}



#拼多多##笔试题目##笔经#
全部评论
第一题先对数组进行排序,再依次对相邻的三个数求方差,最后输出最小方差即可,果断ac
点赞 回复
分享
发布于 2019-08-13 11:16
third打错了
点赞 回复
分享
发布于 2019-08-13 11:13
百信银行
校招火热招聘中
官网直投
请问第三题动态规划解法中的visited的含义是什么呢?就是问题的结果吗?😊
点赞 回复
分享
发布于 2019-08-14 14:54
请问你第三题dp的状态转移方程式是什么?
点赞 回复
分享
发布于 2019-08-15 10:15
visited[sum][numLen] ,第一个参数是n个数和,第二个是n,比如一下,3个数等于10,那么第一个只能取1,2,3. 当取1, 结果等于visited[7][2],取2,结果等于visited[4][2],取3,结果等于visited[1][2],等于0.等于他们三个加起来和,至于为什么这样减,是为了保证单增,a[i]>a[i-1]; for(int i=1;i<=firstNumMax;i++){         visited[numSum-numlen*i][numlen-1] = count_sequences_satisfy_condition(numlen-1,numSum-numlen*i,visited);         sumcount += visited[numSum-numlen*i][numlen-1];     }
点赞 回复
分享
发布于 2019-08-15 10:36
第三题AC了吗?都没用取余哎。
点赞 回复
分享
发布于 2019-08-17 03:03
第二题珍珠题,我写的时候思路错误了,后来我想了一个,思路如下: 我们可以假设排序后的珠子起始位置在x,然后用贪心算法依次将珠子填到x+1,x+2,x+N,得出一个结果,这样暴力得到最终结果(最小的那个就是答案)
点赞 回复
分享
发布于 2019-08-17 20:25

相关推荐

3 15 评论
分享
牛客网
牛客企业服务