首页 > 9.12 网易笔试 - 移动端 共 4 题,过了 3 题
头像
真不愧是杜鹃
编辑于 2020-09-13 09:02
+ 关注

9.12 网易笔试 - 移动端 共 4 题,过了 3 题

# 第一题:大意是给一棵树,输出有几个节点满足恰好有两个子节点
#include <bits/stdc++.h>
using namespace std;

const int N = 110, M = 110;

int n, m;
int h[N], e[M], ne[M], idx;
int son_cnt[N];
bool is_leaf[N];
bool din[N];
int root, res;

void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}

void dfs(int u) {
    if (son_cnt[u] == 0) return;
    else if (son_cnt[u] == 1) {
        int son = e[h[u]];
        if (is_leaf[son]) return;
        else dfs(son);
    } else if (son_cnt[u] == 2) {
        int left = e[h[u]];
        int right = e[ne[h[u]]];

        if (is_leaf[left] && is_leaf[right]) {
            ++ res;
            return;
        }
        if (!is_leaf[left]) dfs(left);
        if (!is_leaf[right]) dfs(right);
    }

}

int main() {
    scanf("%d%d", &n, &m);
    memset(h, -1, sizeof h);
    for (int i = 0; i < N; ++ i) is_leaf[i] = true;

    while (m -- ) {
        int a, b;
        char left_right[10];
        scanf("%d%s%d", &a, left_right, &b);
        add(a, b);
        is_leaf[a] = false;
        din[b] = true;
        ++ son_cnt[a] ;
    }

    for (int i = 1; i <= n; ++ i) {
        if (!din[i]) {
            root = i; break;
        }
    }

    dfs(root);

    printf("%d\n", res);
}
# 第二题:求回文子串的个数
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int res;
char a[N];
bool f[N][N];

int main() {
    scanf("%s", a);
    int Len = strlen(a);
    for (int i = 0; i < Len; ++ i) f[i][i] = true;

    for (int len = 2; len <= Len; ++ len) {
        for (int i = 0; i <= Len - 1 - len + 1; ++ i) {
            if (len == 2 && a[i] == a[i + 1]) {
                ++ res ;
                f[i][i + 1] = true;
            } else if (a[i] == a[i + len - 1] && f[i + 1][i + len - 2]) {
                ++ res ;
                f[i][i + len - 1] = true;
            }
        }
    }
    printf("%d\n", res);
}
# 第三题:求包含偶数个'a', 'b', 'c', 'x', 'y', 'z' 的最长字串
LeetCode 中好像有,忘记怎么做了,0 分

# 第四题:在一个数组中,求满足相加后可以被 7 整除的最大和
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;

int n;
int a[N];

unordered_map<int, int> dfs(int left, int right) {
    unordered_map<int, int> um;
    if (left == right) {
        um[a[left] % 7] = a[left];
        return um;
    }
    int mid = left + right >> 1;
    auto um1 = dfs(left, mid);
    auto um2 = dfs(mid + 1, right);
    for (auto t1 : um1) um[t1.first] = max(um[t1.first], t1.second);
    for (auto t2 : um2) um[t2.first] = max(um[t2.first], t2.second);

    for (auto t1 : um1) {
        for (auto t2 : um2) {
            if (!um.count((t1.first + t2.first) % 7)) {
                um[(t1.first + t2.first) % 7] = t1.second + t2.second;
            } else {
                um[(t1.first + t2.first) % 7] = max(um[(t1.first + t2.first) % 7], t1.second + t2.second);
            }
        }
    }
    
     
    // 卧槽..第二天看面经的时候
    // 发现笔试时这里忘记返回 um 了,是怎么 AC 的...
    // 是不是 C++ 没有指定返回值,会默认返回唯一可能的数据?
    return um;
}

int main() {
    while (scanf("%d", a + n) != EOF) ++ n ;
    int res = dfs(0, n - 1)[0];
    if (res == 0) res = -1;
    printf("%d\n", res);
}






全部评论

(4) 回帖
加载中...
话题 回帖

推荐话题

相关热帖

近期热帖

历年真题 真题热练榜 24小时
技术(软件)/信息技术类
查看全部

近期精华帖

热门推荐