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

萌新最近做了一下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+5
int 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 0xfffff
int 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+5
int 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;
}
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值