網易2018校園招聘的部分編程題

       好久不見各位,校招也算告一段落了,博主有很多收穫和成長,希望有機會分享給大家,同時也歡迎大家把感悟分享給我哦!但是今天我只是來分享一下網易2018校園招聘的部分編程題的個人思路和代碼實現。

first:魔法幣

小易準備去魔法王國採購魔法神器,購買魔法神器需要使用魔法幣,但是小易現在一枚魔法幣都沒有,但是小易有兩臺魔法機器可以通過投入x(x可以爲0)個魔法幣產生更多的魔法幣。
魔法機器1:如果投入x個魔法幣,魔法機器會將其變爲2x+1個魔法幣
魔法機器2:如果投入x個魔法幣,魔法機器會將其變爲2x+2個魔法幣
小易採購魔法神器總共需要n個魔法幣,所以小易只能通過兩臺魔法機器產生恰好n個魔法幣,小易需要你幫他設計一個投入方案使他最後恰好擁有n個魔法幣。
思路解析
博主覺得這道題可以說是斐波那契數列的變形題,本題要的到魔法幣增加的途徑主要有兩個,要麼是2*(x+1)-1,要麼是2*(x+1),由這兩個途徑可知前者會讓魔法幣變爲奇數,後者會讓魔法幣變爲偶數,故要得到N個魔法幣,可以判斷N是否爲偶數,如果是偶數則得到N個魔法幣是通過途徑二獲得的,否則是通過途徑一獲得的,並用棧存儲途徑號碼,然後繼續進行判斷,知道N等於0爲止。最終棧中存儲的元素依次pop出棧即爲得到N個魔法幣的投入方案。
代碼實現
//魔法幣
#include<iostream>
using namespace std;
#include<stack>
 
stack<int> Select(long long money){
    stack<int> result;
 
    bool prev=0;
    while(money>0){
        if(money%2==0){//判斷N是偶數//選擇二號機
            result.push(2);
            money=money/2-1;
        }
        else{//判斷N不是偶數
            result.push(1);
            money=(money-1)/2;
        }  
    }
 
    return result;
}
 
int main(){
    long long money;
    cin>>money;
    if(money>=1&&money<=1000000000){
        stack<int> result=Select(money);
        while(!result.empty()){
            cout<<result.top();
            result.pop();
        }
        cout<<endl;
    }
 
    return 0;
}
second:相反數
爲了得到一個數的"相反數",我們將這個數的數字順序顛倒,然後再加上原先的數得到"相反數"。例如,爲了得到1325的"相反數",首先我們將該數的數字順序顛倒,我們得到5231,之後再加上原先的數,我們得到5231+1325=6556.如果顛倒之後的數字有前綴零,前綴零將會被忽略。例如n = 100, 顛倒之後是1.
思路解析
博主覺得這題主要是考察對於整數各位數字拆分的掌握,即考察對於整數取整(/)和取餘(%)的應用是否熟練。本題是求整數和該整數相反數的和。
用10做取整和取餘的除數,綜合來說是從整數的低位開始取各位的數字再依次乘10得到該整數的相反數,微觀來看是先保存原整數,每次循環都把整數除以10取餘的值tmp加上當前相反數*10的值構成新的相反數,然後整數除以10取整的新的整數,直到整數爲0後停止循環,最後即可求得整數和該整數相反數的和。
代碼實現
#include<iostream>
using namespace std;
 
//相反數
int IsOpposite(int n){
    int sum=0;//先存相反數的值//後存整數和該整數相反數的和
    int num=n;//做運算得到相反數的中間值
     while(num>0){
        int tmp=num%10;//存num除以10的餘
        sum=sum*10+tmp;//當前相反數的值 
        num=num/10;//num取整
    }
     return sum+n;//整數和該整數相反數的和
}

 
int main(){
    int n;
    cin>>n;
    if(n>=1 && n<100000){
        cout<<IsOpposite( n)<<endl;
    }
 
    return 0;
}
third:字符碎片
一個由小寫字母組成的字符串可以看成一些同一字母的最大碎片組成的。例如,"aaabbaaac"是由下面碎片組成的:'aaa','bb','c'。牛牛現在給定一個字符串,請你幫助計算這個字符串的所有碎片的平均長度是多少。
思路解析
本題主要是統計字符串個數和字符碎片的個數,二者相除即可得字符串的所有碎片的平均長度。
相同字母組成爲同一碎片,所以用ch存儲前一個字母,如果ch不等於當前字母,則字符碎片個數加1,最後字符串長度除以字符碎片的個數記爲字符串的所有碎片的平均長度。
代碼實現
法一
//字符碎片
#include<iostream>
using namespace std;
#include<string>
 
 
float Avglen(string & str){
    float sum=0;
    int num=1;
    int size=str.size();
 
    char ch=str[0];
    for(int i=0; i<size; i++){
        if(ch != str[i]){
            num++;
            ch =str[i];
        }
            sum++;
    }
 
 
    return sum/num;
}
 
int main(){
    string str;
    cin>>str;
    if(str.size()>=1 && str.size()<=50){
        float result=Avglen( str);
        printf("%.2lf", result);
    }
 
    return 0;
}
法二
#include<iostream>
using namespace std;
#include<string>
 
 
float Avglen(const char*  str){
    float sum=0;//用來存儲字符串長度
    int num=1;//存儲字符碎片個數
    char ch=*str;//前一個字符
    const char* tmp=str;
    
    
    while('\0' != *tmp){
        if(ch != *tmp){
            num++;
            ch =*tmp;
        }
        sum++;
        tmp++;
    }

    return sum/num;
}
 
int main(){
    string str;
    cin>>str;
    if(str.size()>=1 && str.size()<=50){
        float result=Avglen(str.c_str());
        printf("%.2lf", result);
    }
 
    return 0;
}
fourth:重排是否符合要求
小易有一個長度爲N的正整數數列A = {A[1], A[2], A[3]..., A[N]}。
牛博士給小易出了一個難題:
對數列A進行重新排列,使數列A滿足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍數。
小易現在需要判斷一個數列是否可以重排之後滿足牛博士的要求。
思路解析
本題算是一個數學邏輯題呢,除了最後一個數不用和其他數相乘滿足是4的倍數外,其他都需要滿足此條件。
而要讓兩數積儘量是4的倍數,除了兩數是2的倍數(左右必須是2的倍數或者4的倍數)和其中一個爲4的倍數(左右可爲任意數)外,沒有其他更簡單的可能了。所以綜合來說如果能被2整除的數和能被4整除的數大於數組總數,則能滿足所有的A[i] * A[i + 1](1 ≤ i ≤ N - 1)都是4的倍數的條件。
:遇到此列問題,可例舉不同的例子來尋找規律。
代碼實現
//n-1個數能被2整除,至少有一個能被4整除
#include<iostream>
using namespace std;
#include<vector>
 
long long aim[100000]={0};
 
 
bool IsSuit(int n){
    int num=0;
     
    for(int i=0; i<n; i++){
        if(aim[i]%2 == 0){
            num++;
           if(aim[i]%4 == 0)
             num++;
        }
    }
     
    if(num>=n) return true;
    return false;
}
     
int main(){
    int t;
    cin>>t;
    int n;
    if(1<=t && t>=10){
        for(int i=0; i<t; i++){
            cin>>n;
            if(n<1 || n>100000) continue;
            for(int j=0; j<n; j++){
                cin>>aim[j];
            }
            if(IsSuit(n))
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
    }
    return 0;
}
分享如上,望共同進步,交流學習,願看文的朋友們都能得償所願,心想的事兒都能成!^_^

 


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