字节跳动2020秋招笔试题

字节跳动2020秋招笔试题_第1张图片
字节跳动2020秋招笔试题_第2张图片
字节跳动2020秋招笔试题_第3张图片
常规解法,按部就班,只能过30%:

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    int n;
    cin>>n;
    int cnt=0;
    while(1){
        if(n==1)
            break;
        int a=sqrt(n);
        if(a*a==n){
            n=a;
            cnt++;
        }
        else{
            n-=1;
            cnt++;
        }
    }
    cout<<cnt<<endl;
    return 0;
}

下面思路来自实验室某仁兄,特此感谢!
注意到,求下一个可以开平方的数的技巧,例如:8的下一个可以开平方的数为4,怎么得到4呢,8开根号取整为2,8-2*2=4,这很关键,加快了找到下一可以开方的数的方法,故AC代码如下:

#include 
#include 
using namespace std;

int main(){
    long long M,tag1,count=0;
    cin>>M;
    double tag;
    while(M>1){
        tag1=sqrt(M);
        tag=sqrt(M);

        if(tag1==tag)
        {
            M=sqrt(M);
            count++;
            //cout<
        }
        else
        {
            count=count+(M-tag1*tag1);
            M=tag1*tag1;
            //cout<
        }
        if(M==1)
            break;
    }
    cout<<count<<endl;
    return 0;
}

字节跳动2020秋招笔试题_第4张图片
字节跳动2020秋招笔试题_第5张图片
字节跳动2020秋招笔试题_第6张图片
下面的代码感谢另外一位仁兄。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int main()
{
    int i,a[100001],b[100001],x,y;
    int n;
    cin>>n;
    int jug=1; //标志完全不相同的对(不是个数)
    for(i=0;i<n;i++){
        cin>>a[i]>>b[i];
    }
    int tag1=1,tag2=1; //标志x和y
    //分别判断成对元素对的第一个和第二个元素是否有相同的
    //判断x
    for(i=0;i<n;i++){
        if(jug<0){
            tag1=0;
            break;
        }
        if(i==0){
            x=a[i];
            y=b[i];
        }
        else{
            if(x!=a[i]&&y!=b[i]){
                x=a[i];
                jug--;
            }
        }
    }
    
    //判断y
    if(tag1==1){
        cout<<x<<" "<<y<<endl;
        return 0;
    }
    else{
        jug=1;
        for(i=0;i<n;i++){
            if(jug<0){
                tag2=0;
                break;
            }
            if(i==0){
                x=a[i];
                y=b[i];
            }
            else{
                if(x!=a[i]&&y!=b[i]){
                    y=b[i];
                    jug--;
                }
            }
        }
    }
    if(tag2==1)
        cout<<x<<" "<<y<<endl;
    else
        cout<<"No"<<endl;
    return 0;
}
/*
4
1 5
3 5
1 3
5 5
*/


后记

总共4道题,做得时候除了第一题之外,其余的确实没思路,虽然用一直用python刷题,但是这不是语言的锅,刷题还是太少,没有耐心仔细分析问题。后续继续加大刷题数量和质量。

你可能感兴趣的:(算法)