2018网易内推笔试编程题(一)

来源:互联网 发布:淘宝卖家借贷平台 编辑:程序博客网 时间:2024/05/16 12:47

萌新最近做了一下2018网易的内推编程题集合,要求3个小时解决八道编程题,本萌新两个小时做了6道题,剩下两道题直接放弃了,感觉难度不大,没有具体涉及到什么算法,除了动态规划。



下面对做题的思路以及过程做一个简单的记录:

1.彩色的砖块:

一些彩色的砖块。每种颜色由一个大写字母表示。各个颜色砖块看起来都完全一样。现在有一个给定的字符串s,s中每个字符代表小易的某个砖块的颜色。小易想把他所有的砖块排成一行。如果最多存在一对不同颜色的相邻砖块,那么这行砖块就很漂亮的。请你帮助小易计算有多少种方式将他所有砖块排成漂亮的一行。(如果两种方式所对应的砖块颜色序列是相同的,那么认为这两种方式是一样的。)
例如: s = “ABAB”,那么小易有六种排列的结果:
“AABB”,”ABAB”,”ABBA”,”BAAB”,”BABA”,”BBAA”
其中只有”AABB”和”BBAA”满足最多只有一对不同颜色的相邻砖块。

输入描述:
输入包括一个字符串s,字符串s的长度length(1 ≤ length ≤ 50),s中的每一个字符都为一个大写字母(A到Z)。

输出描述:

输出一个整数,表示小易可以有多少种方式。
解题思路:解题关键词:最多存在一对不同颜色的相邻砖块;即分为两种情况,(1)仅存在一对,那么该字符串仅有两种字母,形似XXXYYYY(2)不存在。那么就仅有一种字母
AC代码:

#include<iostream>#include<map>#include<string>using namespace std;int main(){    string str;    map<char, int> ss;    while(cin>>str){        for(int i = 0; i < str.length(); i++)            ss[str[i]]++;        if(ss.size()>2)            cout<<"0"<<endl;        else if(ss.size()==2)            cout<<"2"<<endl;        else            cout<<"1"<<endl;    }}

2. 等差数列

如果一个数列S满足对于所有的合法的i,都有S[i + 1] = S[i] + d, 这里的d也可以是负数和零,我们就称数列S为等差数列。
小易现在有一个长度为n的数列x,小易想把x变为一个等差数列。小易允许在数列上做交换任意两个位置的数值的操作,并且交换操作允许交换多次。但是有些数列通过交换还是不能变成等差数列,小易需要判别一个数列是否能通过交换操作变成等差数列

输入描述:
输入包括两行,第一行包含整数n(2 ≤ n ≤ 50),即数列的长度。
第二行n个元素x[i](0 ≤ x[i] ≤ 1000),即数列中的每个整数。

输出描述:
如果可以变成等差数列输出”Possible”,否则输出”Impossible”。
解题思路:根据等差数列的性质,该数列必是有序的,要么递增要么递减,要么就是常数列。对于此题,只需把数列排个序,相邻元素做差,只要差不等,即Impossible。
AC代码:

#include<stdio.h>#include<algorithm>using namespace std;#define N 50+5int main(){    int a[N],b[N],n;    while(scanf("%d",&n)!=EOF){        for(int i=0; i<n; i++)            scanf("%d",&a[i]);        sort(a,a+n);        for(int i=1;i<n;i++)            b[i-1] = a[i]-a[i-1];        bool flag;        flag = true;        for(int i=0 ;i<n-2; i++)            if(b[i+1] != b[i])            {                flag = false;                break;            }        if(flag)            printf("Possible");        else            printf("Impossible");    }    return 0;}

3. 交错01串

如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: “1”,”10101”,”0101010”都是交错01串。
小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。
输入描述:

输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含’0’和’1’

输出描述:

输出一个整数,表示最长的满足要求的子串长度。
解题思路:这题和“最大连续子串和”类似,只不过更简单些。因为字符串仅有01,因此只需把后一个字符与前一个字符比较,不同的话,计数器累加,相同的话,更新子串长度值,并置计数器为0,重新计数
AC代码:

#include<stdio.h>#include<string>#include<algorithm>#include<iostream>using namespace std;#define Max 0xfffffint main(){    string str;    while(cin>>str){        int count=0,max_len = -Max;        for(int i=0; i<str.length();){            if(str[i+1] == str[i]){                if(count > max_len)                    max_len = count;                count = 0;            }            else                count++;            i++;        }        if(count == str.length())            printf("%d",count);        else            printf("%d\n",max_len+1);    }    return 0;}

4. 操作序列

小易有一个长度为n的整数序列,a_1,…,a_n。然后考虑在一个空序列b上进行n次以下操作:
1、将a_i放入b序列的末尾
2、逆置b序列
小易需要你计算输出操作n次之后的b序列。

输入描述:

输入包括两行,第一行包括一个整数n(2 ≤ n ≤ 2*10^5),即序列的长度。
第二行包括n个整数a_i(1 ≤ a_i ≤ 10^9),即序列a中的每个整数,以空格分割。

输出描述:

在一行中输出操作n次之后的b序列,以空格分割,行末无空格。
解题思路:此题序列的长度长达2*10^5,肯定不能直接模拟来的。我们可以先按照题目要求写出前几项:这里写图片描述我们可以发现规律:b序列总是从最大的位置以2为差递减到最小的位置,然后又以2为和递增到第二大的位置,由此不难写出AC代码
AC代码

#include<stdio.h>#define N 200000+5int a[N],b[N];int main(){    int n;    while(scanf("%d", &n) != EOF){        for(int i=1; i<=n; i++)            scanf("%d",&a[i]);        int num = 1;        for(int i=n; i>=1;){            b[num++] = a[i];            i -= 2;        }        int j;        if(n & 1) //分奇偶两种情况            j = 2;        else            j = 1;        for( ; j < n; ){            b[num++] = a[j];            j += 2;        }        for(int k=1; k<=n; k++){            if(k != n)                printf("%d ",b[k]);            else                printf("%d\n",b[k]);        }    }    return 0;}

5. 独立的小易

小易为了向他的父母表现他已经长大独立了,他决定搬出去自己居住一段时间。一个人生活增加了许多花费: 小易每天必须吃一个水果并且需要每天支付x元的房屋租金。当前小易手中已经有f个水果和d元钱,小易也能去商店购买一些水果,商店每个水果售卖p元。小易为了表现他独立生活的能力,希望能独立生活的时间越长越好,小易希望你来帮他计算一下他最多能独立生活多少天。
输入描述:

输入包括一行,四个整数x, f, d, p(1 ≤ x,f,d,p ≤ 2 * 10^9),以空格分割
解题思路:此题是到简单的数学题,我们要先判断手中的d元钱够不够支付f天(每天一个苹果嘛)的房租,不够的话那就没有继续下去的必要了。k = d - f*x 。如果k<=0 那么最大只能活 min(f, d/x)天咯。k>0的话,那就用剩下的钱买苹果交房租咯,即m*(p+x)=k,求m.
AC代码:

#include<iostream>#include<algorithm>using namespace std;int main(){    long long x, f, d, p;    while(cin>>x>>f>>d>>p){        int m,n=0,k;        k = d - x*f;        n = min(d/x, f);        if(k <= 0){            cout<< n <<endl;        }        else{            cout<< n+k/(p+x)<<endl;        }    }    return 0;}