【秋招机试真题】网易笔试0919

第一题:

题目描述:无聊的牛牛突发奇想,想将手中的一排格子红蓝两种颜色,对于每个格子牛牛都有自己的想法。例如,如下的格子。

 1号和2号格子涂蓝色,3号格子涂红色,4号格子涂蓝色,5号格子涂红色,6、7涂蓝色,8号涂红色。如果按照这个方法涂的华,他需要6步(1、2可以一起涂,6、7可以一起涂)。但是他也可以将1-7号涂上蓝色,再将3、5、8号分别涂成红色,则步数数量最少,为4次。


说明:第一题10分钟AC,挺简单的;


解题思路:

三种方案:

        1、一个颜色一个颜色的涂;

        2、全涂成红色,再分块涂蓝色;

        3、全涂成蓝色,再分块涂红色;

统计有几块颜色;


代码如下:

#include<iostream>
using namespace std;
int solution(int N, string s) {
    //将格子按照颜色分成不同的块
    if (N == 0) return 0;
    char cur = s[0];
    int count = 1;
    int B_count = (cur == 'B') ? 1 : 0;
    for (int i = 1; i < N; ++i) {
        if (s[i] != cur) {
            if (s[i] == 'B') B_count++;
            count++;
            cur = s[i];
        }
    }
    return min(count, min(1 + B_count, 1 + count - B_count));
}

int main() {
    int N;
    cin >> N;
    string s;
    cin >> s;
    cout << solution(N, s) << endl;
}

第二题:

题目描述:给出两个数字a, b,a每次可以乘上一个大于1的正整数得到新的a,我们将这个操作叫做一次它乘。现在请你计算,a是否可以通过若干次它乘变为b。

若a可以通过若干次它乘变为b,请你计算最多可以经过多少次它乘。若a不可能变为b,输出-1即可。


说明:第二题AC


解题思路:将问题转化成寻找一个数最多可以拆成多少个因数的积,暴力查找


代码如下:

#include<iostream>
using namespace std;
int maxOperate(int a, int b) {
    if (b % a) return -1;
    int c = b / a;
    int nums = 0;
    while (c != 1) {
        int limit = c;
        for (int i = 2; i <= limit; ++i) {
            if (c == 1) break;
            if (!(c % i)) {
                c /= i;
                ++nums;
                break;
            }
        }
    }
    return nums;
}

int main() {
    int a, b;
    cin >> a >> b;
    cout << maxOperate(a, b) << endl;
}


第三题:

题目描述:对于一个只包含英文字母的字符串,你可以更改其中的字符,不同的更改类型,代价不同,如下:

        - 将一个字母改为另一个大小写相同的字母花费为5

        - 将一个字母由大写改为小写或者由小写改为大写花费为5

现在请你求出对于任给的一个只包含英文字母的字符串,使之其中包含有子串AcMer的最小代价是多少?


说明:第三题AC


解题思路:

        1、对于长度为5的字符串,直接计算每个字符需要的代价,有以下几种情况:

                1、都是大写或者都是小写,花费为5

                2、是同一个字母的大小写,花费为5

                3、其他情况,花费为10

        2、对于长度大于5的字符串,直接进行滑动窗口,窗口大小为5,记录最小的代价


代码如下:       

#include<iostream>
#include<algorithm>
using namespace std;
int minCostHelper(string& s, string& p, int start) {
    //该函数只计算长度为5的子串和pattern之间的cost
    // AcMer
    // 1、判断两字母是否相等
    // 2、判断两字母是否互为大小写
    // 3、判断两字母是否同为大写, 或同为小写
    // AcAer AcMer
    int cost = 0;
    for (int i = 0; i < 5; ++i) {
        if (s[start + i] == p[i]) {
            continue;
        }
        else if (abs(s[start + i] - p[i]) == 32) {
            cost += 5;
        }
        else if (s[start + i] >= 'a' && s[start + i] <= 'z' && p[i] >= 'a' && p[i] <= 'z') {
            cost += 5;
        }
        else if (s[start + i] >= 'A' && s[start + i] <= 'Z' && p[i] >= 'A' && p[i] <= 'Z') {
            cost += 5;
        }
        else {
            cost += 10;
        }
    }
    return cost;
}
int minCost(string& s, string& p) {
    if (s == p) return 0;
    if (s.size() == 5) {
        return minCostHelper(s, p, 0);
    }
    int min_cost = INT_MAX;
    for (int i = 0; i <= s.size() - 5; ++i) {
        min_cost = min(min_cost, minCostHelper(s, p, i));
    }
    return min_cost;
}

int main() {
    string s;
    cin >> s;
    string p = "AcMer";
    cout << minCost(s, p) << endl;
}

  


第四题:

题目描述:牛牛有一个正整数n,牛牛想你将n拆分成一个首项为1的等比数列,该等比数列的和为n。牛牛希望该等比数列的项数越多越好,请你输出该等比数列的项数以及公比(公比>=2)


说明:此题通过率为0,示例和自己编写的一些示例都过了,不知道问题出在哪里


解题思路:

        等比数列公式:

 其中前n项和为输入n,N为项数,希望找到项数最多的情况,也就是公比越小越好,所以从公比=2开始找,

计算前N项和, 可知前N项和必须是整数,所以就是找第一个前N项和为整数的那个,就是答案。


代码如下:

#include<iostream>
#include<math.h>
#include<vector>
using namespace std;
vector<int> solution(int n) {
    // 公比 q
    // 项数 N
    long 
    long int X, N, N_int;
    int q_res;
    double N_d, error;
    for (int q = 2; q < n; ++q) {
        X = 1 - n * (1 - q);
        N_d = log(X) / log(q);
        N_int = int(log(X) / log(q));
        error = N_d - N_int;
        if (error == (double)0.0) {
            N = (int)(log(X) / log(q));
            q_res = q;
            break;
        }
    }
    return { N, q_res };
}
int main() {
    int t;
    cin >> t;
    int n;
    vector<int> res;
    for (int i = 0; i < t; ++i) {
        cin >> n;
        res = solution(n);
        for (int i = 0; i < res.size(); ++i) {
            if (i == 0) cout << res[i];
            else cout << " " << res[i];
        }
        cout << endl;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值