2019字节跳动笔试题

第三题
有n个人参加编程比赛,比赛结束后每个人都得到一个分数,现在所有人排成一圈(第一个和第n个相邻)领取奖品,要求:
1.现在某个人的分数比左右的人告,那么奖品数量也比左右的人多;
2.每个人至少得到一个奖品
问最少应该准备多少个奖品?

测试用例:
N组数据
每组数组输入n个人,n个人的分数

输入:
2
2
1 2
4
1 2 3 3


输出
3
8

leetcode相似题:candy

思路:先从左至右遍历,如果i+1的元素比i要大,那个i+1的奖品数就等于i的奖品数+1,否则就保持为1.然后再从右向左遍历,如果当前i的分数比i+1的分数要大,那么当前分数就等于max(当前的分数, i+1的分数+1)。
代码:

int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        int n;
        int *rates=new int[n];
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>rates[i];
        vector<int> num(n, 1); //初始化为1
        for(int i=1;i<n;i++)
        {
            if(rates[i]>rates[i-1])
                num[i]=num[i-1]+1;
        }
        for(int i=n-1; i>=0; i--)
        {
            if(rates[i]>rates[(i+1)%n])
                num[i]=max(num[i], num[(i+1)%n]+1);
        }
        int sum=0;
        for(int i=0;i<n; i++)
            sum+=num[i];
        cout<<sum<<endl;

    }
    return 0;
}

第四题
有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对n根绳子进行任意剪裁(不能拼接),请你帮忙设计出这m根绳子最长的长度是多少?

输入描述:
输入N,M
N个Li

输入:
3 4
3 5 4
输出:
2.50

二分(注意精度,以及保留两位小数)

#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
vector<double> L;
int n,m;
bool check(double k)
{
    int count=0;
    for(int i=0; i<n; i++)
    {
        count+=L[i]/k;
    }
    return count>=m;
}
double slove(vector<double>& L)
{
    double l=0.f, r=L[n-1]+1.f;
    while(l<r)
    {
        double k=(l+r)/2.0;
        if(check(k))
        {
            l=k;
        }
        else
        {
            r=k-0.001;
        }
    }
    return l;

}
int main()
{

    cin>>n>>m;
    double x;
    for(int i=0; i<n; i++)
    {
        cin>>x;
        L.push_back(x);
    }
    sort(L.begin(), L.end());
    double result;
    result=slove(L);
    printf("%.2f", result);
    return 0;
}

第二题:
修正拼写错误:

  1. 3个相同的字母连在一起,去掉一个:helllo–>hello
  2. 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好了,比如:helloo–>hello
  3. 上面的规则优先“从左到右”匹配,即AABBCC,优先考虑修复AABB,结果为AABCC

思路:新建一个新的字符串,在新的字符串上进行判断,如果没有错误就将字符添加到newstring中,否则继续根据newstring之前的字符串进行判断。

输入:
2
helloo
wooooooow

输出:
hello
woow

代码:

#include <iostream>
#include <cstdlib>
#include <vector>
#include <string.h>
using namespace std;

int main()
{
    int N;
    cin>>N;
    while(N--)
    {
        string s;
        cin>>s;
        if(s.size()<2)
        {
            cout<<s<<endl;
            return 0;
        }
        string newstring=s.substr(0,2);
        int i=2,j=2;
        while(i<s.size())
        {
            if(newstring[j-2]==newstring[j-1] && newstring[j-1]==s[i])
            {
                i++;
            }
            else if(j>2 &&newstring[j-3]==newstring[j-2] && newstring[j-1]==s[i])
            {

                i++;
            }
            else
            {
                newstring+=s[i];
                j++;
                i++;
            }
        }
        cout<<newstring<<endl;

    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章