1. 程式人生 > >網易2017秋招程式設計題集合

網易2017秋招程式設計題集合

You are always too soft.

1、如果一個數字序列逆置之後跟原序列是一樣的就稱這樣的數字序列為迴文序列。例如:
{1, 2, 1}, {15, 78, 78, 15} , {112} 是迴文序列, 
{1, 2, 2}, {15, 78, 87, 51} ,{112, 2, 11} 不是迴文序列。
現在給出一個數字序列,允許使用一種轉換操作:
選擇任意兩個相鄰的數,然後從序列移除這兩個數,並用這兩個數字的和插入到這兩個數之前的位置(只插入一個和)。
現在對於所給序列要求出最少需要多少次操作可以將其變成迴文序列。

輸入描述:
輸入為兩行,第一行為序列長度n ( 1 ≤ n ≤ 50) 第二行為序列中的n個整數item[i] (1 ≤ iteam[i] ≤ 1000),以空格分隔。


輸出描述:
輸出一個數,表示最少需要的轉換次數

輸入例子1:
4 1 1 1 3

輸出例子1:
2
#include <iostream>
using namespace std;
int main()
{
    int n,a[50]={0},count=0,i,j;
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i];
    i=0;
    j=n-1;
    while(i!=j&&i<j)
    {
        if(a[i]<a[j])
        {
            a[i+1]=a[i]+a[i+1];
            a[i]=0;
            i++;
            count++;
        }
        else if(a[i]>a[j])
        {
            a[j-1]=a[j]+a[j-1];
            a[j]=0;
            j--;
            count++;
        }
        else{
        i++;
        j--;
        }
    }
    cout<<count;
    return 0;
}
2、小易有一個圓心在座標原點的圓,小易知道圓的半徑的平方。小易認為在圓上的點而且橫縱座標都是整數的點是優雅的,小易現在想尋找一個演算法計算出優雅的點的個數,請你來幫幫他。
例如:半徑的平方如果為25
優雅的點就有:(+/-3, +/-4), (+/-4, +/-3), (0, +/-5) (+/-5, 0),一共12個點。 
輸入描述:
輸入為一個整數,即為圓半徑的平方,範圍在32位int範圍內。


輸出描述:
輸出為一個整數,即為優雅的點的個數

輸入例子1:
25

輸出例子1:
12
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
    int n,count1=0,m,count2=0;
    cin>>n;
    m=(int)sqrt(n);
    for(int i=1;i<=m;i++)
    {
        for(int j=i;j<=m;j++)
        {
            if(i*i+j*j==n && i<j)
            {
                count1=count1+1;
            }
            if(i*i+j*j==n && i==j)
            {
                count2=count2+1;
            }
        }
    }
    if(m*m==n)
        cout<<count1*8+4+count2*4;
    else cout<<count1*8+count2*4;
    return 0;
}
3、小易來到了一條石板路前,每塊石板上從1挨著編號為:1、2、3.......
這條石板路要根據特殊的規則才能前進:對於小易當前所在的編號為K的 石板,小易單次只能往前跳K的一個約數(不含1和K)步,即跳到K+X(X為K的一個非1和本身的約數)的位置。 小易當前處在編號為N的石板,他想跳到編號恰好為M的石板去,小易想知道最少需要跳躍幾次可以到達。
例如:
N = 4,M = 24:
4->6->8->12->18->24
於是小易最少需要跳躍5次,就可以從4號石板跳到24號石板 
輸入描述:
輸入為一行,有兩個整數N,M,以空格隔開。 (4 ≤ N ≤ 100000) (N ≤ M ≤ 100000)


輸出描述:
輸出小易最少需要跳躍的步數,如果不能到達輸出-1

輸入例子1:
4 24

輸出例子1:
5
思路:求起點到任意位置的最小步數,兩種情況,這個點以前到達過時,比較當前的步數和以前的步數取最小;未到達過時,這個點的最小步數是起點的最小步數加一
#include<iostream>
#include<vector>
#include<math.h>

using namespace std;
void calYueshu(int n,vector<int> &yueshu);

int main()
{
    int N,M;
    cin>>N>>M;
    vector<int> steps(M+1,0);
    steps[N]=1;

    for(int i=N;i<=M;++i){
        if(steps[i]==0)continue;   //位置無法到達,跳過
        vector<int> yueshu;
        calYueshu(i,yueshu);
        for(int j=0;j<yueshu.size();++j){  //記錄從起點N到位置i的最小步數
            if(yueshu[j]+i<=M){
                if(steps[yueshu[j]+i]==0)    //到達位置i的最小步數加1
                    steps[yueshu[j]+i]=steps[i]+1;
                else                         //其它點也能到達,比較大小,記錄最小步數
                    steps[yueshu[j]+i]=(steps[i]+1)<steps[yueshu[j]+i]?(steps[i]+1):steps[yueshu[j]+i];
            }
        }
    }

    if(steps[M]==0)
        cout<<-1<<endl;
    else
        cout<<steps[M]-1<<endl;
    return 0;
}

//求約數
void calYueshu(int n,vector<int> &yueshu){
    for(int i=2;i<=sqrt(n);++i){
        if(n%i==0){
            yueshu.push_back(i);
            if(n/i != i)
                yueshu.push_back(n/i);
        }
    }
}


5、對於一個整數X,定義操作rev(X)為將X按數位翻轉過來,並且去除掉前導0。例如:
如果 X = 123,則rev(X) = 321;
如果 X = 100,則rev(X) = 1.
現在給出整數x和y,要求rev(rev(x) + rev(y))為多少? 
輸入描述:
輸入為一行,x、y(1 ≤ x、y ≤ 1000),以空格隔開。


輸出描述:
輸出rev(rev(x) + rev(y))的值

輸入例子1:
123 100

輸出例子1:
223
#include <iostream>
using namespace std;
int fz(int n)
{
    int n1=0;
    while(n>0)
    {
        int temp=n%10;
        n1=n1*10+temp;
        n=n/10;
    }
    return n1;
}
int main()
{
    int x,y;
    cin>>x>>y;
    int xx=fz(x);
    int yy=fz(y);
    int xy=fz(xx+yy);
    cout<<xy<<endl;
    return 0;
}
6、小易是一個數論愛好者,並且對於一個數的奇數約數十分感興趣。一天小易遇到這樣一個問題: 定義函式f(x)為x最大的奇數約數,x為正整數。 例如:f(44) = 11.
現在給出一個N,需要求出 f(1) + f(2) + f(3).......f(N)
例如: N = 7 
f(1) + f(2) + f(3) + f(4) + f(5) + f(6) + f(7) = 1 + 1 + 3 + 1 + 5 + 3 + 7 = 21
小易計算這個問題遇到了困難,需要你來設計一個演算法幫助他。 
輸入描述:
輸入一個整數N (1 ≤ N ≤ 1000000000)


輸出描述:
輸出一個整數,即為f(1) + f(2) + f(3).......f(N)

輸入例子1:
7

輸出例子1:
21
思路:奇數最大奇約數是本身,偶數是將其除2直到最大的奇數,直接這樣判斷求和會超時。所以再做處理,先算1、3、5、7奇數和,那麼2、4、6的和跟1、2、3的奇數和相同,那麼可以轉化成求1、2、3的,再看這個序列,1、3是奇數,直接求和,2的奇約數可以轉化成1的最大奇約數,所以這個求和轉化成3部分,1、3、5、7,1、3,1這三部分的奇約數和。
#include <iostream>
using namespace std;
int main()
{
    long n;
    long sum=0;
    cin>>n;
    for(long i=n;i>0;i=i/2)
    {
        long temp=(i+1)/2;
        sum+=temp*temp;
    }
    cout<<sum;
    return 0;
}

7、小易去附近的商店買蘋果,奸詐的商販使用了捆綁交易,只提供6個每袋和8個每袋的包裝(包裝不可拆分)。 可是小易現在只想購買恰好n個蘋果,小易想購買儘量少的袋數方便攜帶。如果不能購買恰好n個蘋果,小易將不會購買。 
輸入描述:
輸入一個整數n,表示小易想購買n(1 ≤ n ≤ 100)個蘋果


輸出描述:
輸出一個整數表示最少需要購買的袋數,如果不能買恰好n個蘋果則輸出-1

輸入例子1:
20

輸出例子1:
3
#include <iostream>
using namespace std;
int main()
{
    int n,num8,num=0,i;
    cin>>n;
    num8=n/8;
    for(i=num8;i>=0;i--)
    {
        if((n-i*8)%6==0)
        {
            num=i+(n-i*8)/6;
            break;
        }
    }
    if(i>=0) cout<<num;
    else cout<<-1;
    return 0;
}

8、A,B,C三個人是好朋友,每個人手裡都有一些糖果,我們不知道他們每個人手上具體有多少個糖果,但是我們知道以下的資訊:
A - B, B - C, A + B, B + C. 這四個數值.每個字母代表每個人所擁有的糖果數.
現在需要通過這四個數值計算出每個人手裡有多少個糖果,即A,B,C。這裡保證最多隻有一組整數A,B,C滿足所有題設條件。 
輸入描述:
輸入為一行,一共4個整數,分別為A - B,B - C,A + B,B + C,用空格隔開。 範圍均在-30到30之間(閉區間)。


輸出描述:
輸出為一行,如果存在滿足的整數A,B,C則按順序輸出A,B,C,用空格隔開,行末無空格。 如果不存在這樣的整數A,B,C,則輸出No

輸入例子1:
1 -2 3 4

輸出例子1:
2 1 3
#include <iostream>
using namespace std;
int main()
{
    int s1,s2,s3,s4;
    int a,b,c;
    cin>>s1>>s2>>s3>>s4;
    if((s1+s3)%2==0 && (s2+s4)%2==0 && (s4-s2)%2==0 && (s3-s1)==(s2+s4)){
     a=(s1+s3)/2;
    b=(s2+s4)/2;
     c=(s4-s2)/2;
     cout<<a<<" "<<b<<" "<<c;
    }
    else
        cout<<"No";
    return 0;
}