网易2017秋招编程题集合

来源:互联网 发布:淘宝达人文章怎么赚钱 编辑:程序博客网 时间:2024/05/29 15:34

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;}




原创粉丝点击