2019.9.1 拼多多算法岗笔试编程题(未解决)

1.题目描述:

给出许多个数,然后排序。偶数优先级最高,同奇偶性的话,数字大的优先级高。再给出一个n,输出排序后的前n项

输入描述:

输入很恶心,前面的数都用逗号分隔,后面的n用分号分隔。

输出描述:

输出排序之后的前n个数

样例1:

输入:
1,2,3,4,5;3
输出:
4,2,5

数据规模:

保证n小于等于数字量。能一行输入的东西,肯定不大。就是再大,O(nlog)也能跑完,再解不了的话不用写了。

思路:

C++莫得split函数,只好手写。AC 100%

代码:

#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
string input;
vector<int> splitNum(string input)
{
    vector<int> res;
    int cnt = 0;
    res.push_back(0);
    for(int i=0;i<input.size();i++)
    {
        if('0'<=input[i] && input[i]<='9')
        {
            res[cnt] = res[cnt]*10 + input[i]-'0';
        }
        else
        {
            res.push_back(0);
            cnt++;
        }
    }
    return res;
}
bool cmp(int a,int b)
{
    if(a%2==0 && b%2==0)
        return a>b;
    if(a%2==1 && b%2==1)
        return a>b;
    if(a%2==0 && b%2==1)
        return 1;
    if(a%2==1 && b%2==0)
        return 0;
}
int main()
{
    vector<int> Num;
    int cnt,n;
    cin>>input;
    Num = splitNum(input);
    cnt = Num.size()-1;
    n = Num.at( Num.size()-1 );
    sort(Num.begin(),Num.end()-1,cmp);
    for(int i=0;i<n;i++)
    {
        cout<<Num[i];
        if(i<n-1)printf(",");
    }cout<<endl;

    return 0;
}


2.题目描述:

输入描述:

输出描述:

样例1:

输入:
3 
123 
3 
321 
123 
45 
67
输出:
{
d d l
d d r
}
{
l l l
r l l
}
{
}

数据规模:

思路:

AC 100%

代码:

#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
int N;
string s1,s2,st;
vector<char> res;
int dfs(int round,int i)
{/*printf("N=%d round=%d\n",N,round);
cout<<st<<endl;*/
    if(round >= N)
    {
        if(st==s2)
        {
            for(int i=0;i<res.size();i++)
                printf("%c ",res[i]);
            printf("\n");
            return 1;
        }
        return 0;
    }
    res.push_back('d');
    dfs(round+1,i+1);
    res.pop_back();

    res.push_back('l');
    st.insert(st.begin(),s1[i]);
    dfs(round+1,i+1);
    st.erase(st.begin());
    res.pop_back();

    res.push_back('r');
    st += s1[i];
    dfs(round+1,i+1);
    st.erase(st.end()-1);
    res.pop_back();
}
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        cin>>s1>>s2;
        N = s1.size();
        printf("{\n");
        map<char,int> MP;
        for(int i=0;i<s1.size();i++)
            MP[s1[i]]++;
        for(int i=0;i<s2.size();i++)
        {
            if(MP[s2[i]] == 0){goto loop1;}
            MP[s2[i]]--;
        }
        dfs(0,0);
        loop1:;
        printf("}\n");
    }
    return 0;
}


3.题目描述:

概率论,n个骰子每个面数都不一定,给出n个数,x[i]代表第i个骰子有x[i]个面,第i个骰子掷出某个面的概率为1/x[i]。
一波掷n个骰子,最大的数作为结果,求期望。

输入描述:

输出描述:

样例1:

输入:
2
2 2
输出:
1.75

数据规模:

思路:

概率论,那哪会啊。听说是用个概率dp来解

代码:




4.题目描述:

在一块长为n,宽为m的场地上,有 n * m 个 1 * 1 的单元格,每个单元格上的数字就是按照从1到n和1到m中的数的乘积。具体如下


n = 3,m = 3
1 2 3
2 4 6
3 6 9


给出一个查询的值k,求出按照这个方式列举的的数中第k大的值V。

例如上面的例子里,
从大到小为(9,6,6,4,3,3,2,2,1)
k = 1,V = 9
k = 2,V = 6
k = 3,V = 6

k = 9,V = 1

输入描述:

只有一行是3个数n, m, k 表示场地的宽高和需要查询的k。
使用空格隔开。

输出描述:

给出第k大的数的值。

样例1:

输入:
3 3 4
输出:
4

数据规模:

100%的数据
1 <= n, m <= 40000
1 <= k <= n*m
30%的数据
1 <= n, m <= 1000

思路:

我没解出来。只暴力了30%

代码:

#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
    int n,m,k;
    map<int,int> MP;
    scanf("%d%d%d",&n,&m,&k);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            MP[i*j]++;
        }
    }
    for(map<int,int>::reverse_iterator it=MP.rbegin();it!=MP.rend();it++)
    {
        if(k>it->second)
            k -= it->second;
        else
        {
            printf("%d\n",it->first);
            break;
        }
        cout<< it->first <<" "<< it->second <<endl;

    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值